R:根据另一个变量在数据框中添加行

时间:2018-10-22 14:57:27

标签: r

我正在尝试做一种有条件的rowSums

我有一个数据框,其中有四列包含1和0的列,以及另一个变量,该变量指示应添加哪些列以使行总计。

例如:

df <- matrix(rbinom(40, 1, 0.5), ncol = 4)
df <- as.data.frame.matrix(df)
df$group <- sample(c('12', '123', '1234'), 10, replace = T)

如果组为12,则应添加列V1:V2,如果添加123,则应添加V1:V3,如果添加1234,则应添加列V1:V4。

我尝试了一种劳动密集型的方法:

df$total12 <- rowSums(df[,c('V1', 'V2')])
df$total123 <- rowSums(df[,c('V1', 'V2', 'V3')])
df$total1234 <- rowSums(df[,c('V1', 'V2', 'V3', 'V4')])
df$total <- ifelse(df$group == '12', df$total12,
                   ifelse(df$group == '123', df$total123, df$total1234))

有更简单的方法吗?

2 个答案:

答案 0 :(得分:1)

这里是一个选项。我们通过拆分“组”来创建行/列索引,根据索引提取“ df”的值,然后获取按FROM ubuntu:16.04 : : if exists <repo-name> COPY <repo-name> else RUN git clone <url> : 索引分组的sum

row

答案 1 :(得分:1)

这是使用switch函数的另一个选项。与一系列嵌套的ifelse语句相比,此方法更易读且易于扩展。

df$total<-sapply(1:length(df$group), function(i){switch(df$group[i], 
            "12"=rowSums(df[i, c('V1', 'V2')]),
            "123"=rowSums(df[i, c('V1', 'V2', 'V3')]),
            "1234"=rowSums(df[i, c('V1', 'V2', 'V3', 'V4')]))})

基本上,循环遍历df $ group的元素并选择要使用的适当公式。如果数据集不太长,性能应该可以接受。