gpt4 book ai didi

r - 每行对不同范围的列求和

转载 作者:行者123 更新时间:2023-12-04 02:27:35 26 4
gpt4 key购买 nike

我想在我的数据集中创建一个新变量来对特定范围的列求和,但是要求和的列范围因每一行而异。

这是我的示例数据集。我想创建一个新变量 NUM1,它是列 1 到 ARRAYEND 的总和,其中变量 ARRAYEND 指定列 NUM1 总和应为。

#create sample dataset
r1<-c(1,1,1,1,0,2)
r2<-c(1,1,0,1,1,4)
df<-as.data.frame(rbind(r1,r2))
names(df)<-c("Flag1","Flag2","Flag3","Flag4","Flag5","ARRAYEND")

Flag1 Flag2 Flag3 Flag4 Flag5 ARRAYEND
r1 1 1 1 1 0 2
r2 1 1 0 1 1 4

这是我想要的结果:

  Flag1 Flag2 Flag3 Flag4 Flag5 ARRAYEND NUM1
r1 1 1 1 1 0 2 2
r2 1 1 0 1 1 4 3

我试图通过 dplyr 做到这一点,但它给我一个错误。

df <-df %>% mutate(NUM1 = rowSums(.[1:df$ARRAYEND]))

Warning messages:
1: Problem with `mutate()` input `NUM1`.
ℹ numerical expression has 2 elements: only the first used
ℹ Input `NUM1` is `rowSums(.[1:df$ARRAYEND])`.
2: In 1:df$ARRAYEND :
numerical expression has 2 elements: only the first used

最佳答案

base R 选项是使用 applyMARGIN = 1 遍历行,然后获取 seq'ARRAYEND' 的 uence,子集 'x' 的元素并获得 sum

df$NUM1 <- apply(df, 1, function(x)  sum(x[seq(x['ARRAYEND'])]))

-输出

df
# Flag1 Flag2 Flag3 Flag4 Flag5 ARRAYEND NUM1
#r1 1 1 1 1 0 2 2
#r2 1 1 0 1 1 4 3

注意:tidyverse 不保留行名。所以,最好使用 base R


如果我们想要 tidyverse,一个选项是首先将行名作为列

library(tibble)
library(dplyr)
df %>%
rownames_to_column('rn') %>%
rowwise %>%
mutate(NUM1 = sum(c_across(starts_with("Flag"))[seq(ARRAYEND)])) %>%
ungroup %>%
column_to_rownames('rn')

-输出

#   Flag1 Flag2 Flag3 Flag4 Flag5 ARRAYEND NUM1
#r1 1 1 1 1 0 2 2
#r2 1 1 0 1 1 4 3

关于r - 每行对不同范围的列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66445650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com