【问题标题】:R - Summing over a row for specific columns using a listR - 使用列表对特定列的行求和
【发布时间】:2020-08-19 01:03:22
【问题描述】:

我的目标是对我的数据框的某些列进行求和,并将该总和输入到一个新列中。

假设我有以下data.frame:

df <- data.frame(names=c("a","b","c","d","e","f"),
                 wb01=c(1,1,0,1,1,0),
                 wb02=c(0,0,0,0,1,1),
                 wb03=c(0,0,1,1,1,1),
                 wb04=c(1,1,0,1,1,1),
                 wb05=c(1,0,1,0,0,1),
                 wb06=c(1,1,1,1,1,1)) 

rownames(df) <- df$names

  wb01 wb02 wb03 wb04 wb05 wb06
a  1    0    0    1    1    1
b  1    0    0    1    0    1
c  0    0    1    0    1    1
d  1    0    1    1    0    1
e  1    1    1    1    0    1
f  0    1    1    1    1    1

我想通过使用包含要求和的列名称的向量来选择要求和的列。 (我的真实数据框和我将选择的列数非常大,而不是捆绑在一起,即/我不能只选择第 3-5 列,也不想输入每一列,因为它会超过 2k。 ..)

但回到示例,这里是我想总结的列:

genelist <- c(wb02, wb03, wb06)

所以结果应该是这样的:

  wb01 wb02 wb03 wb04 wb05 wb06 sum_genelist
a  1    0    0    1    1    1         1
b  1    0    0    1    0    1         1
c  0    0    1    0    1    1         2
d  1    0    1    1    0    1         3
e  1    1    1    1    0    1         3
f  0    1    1    1    1    1         3

感谢您的帮助或提示!

【问题讨论】:

  • 对于提到的列,名称中是否有任何模式?
  • 我发布了使用的数据。它对我有用

标签: r dataframe sum


【解决方案1】:

我们可以使用rowSums

df$sum_genelist <- rowSums(df[intersect(genelist, names(df))], na.rm = TRUE)
df
#  names wb01 wb02 wb03 wb04 wb05 wb06 sum_genelist
#a     a    1    0    0    1    1    1            1
#b     b    1    0    0    1    0    1            1
#c     c    0    0    1    0    1    1            2
#d     d    1    0    1    1    0    1            2
#e     e    1    1    1    1    0    1            3
#f     f    0    1    1    1    1    1            3
 

在哪里

genelist <- c('wb02', 'wb03', 'wb06')

数据

df <- structure(list(names = c("a", "b", "c", "d", "e", "f"), wb01 = c(1, 
1, 0, 1, 1, 0), wb02 = c(0, 0, 0, 0, 1, 1), wb03 = c(0, 0, 1, 
1, 1, 1), wb04 = c(1, 1, 0, 1, 1, 1), wb05 = c(1, 0, 1, 0, 0, 
1), wb06 = c(1, 1, 1, 1, 1, 1)), row.names = c("a", "b", "c", 
"d", "e", "f"), class = "data.frame")

【讨论】:

  • 谢谢我试过了,得到了这个错误:[.data.frame(df,genelist) 中的错误:选择了未定义的列现在让我觉得我的基因列表中有一些东西不在我的列中数据框...(在我的大型真实 df 中不是这个示例。)
  • @LauraChipman 只有当genelist 的某些名称不在原始数据中时才会发生此错误。试试rowSums(df[intersect(genelist, names(df))])
  • @LauraChipman 我的意思是您可以在默认数据集mtcarsmtcars[c('ab', 'cd')]# Error in [.data.frame(mtcars, c("ab", "cd")) : undefined columns selected 上复制相同的错误
【解决方案2】:

您只能使用any_ofselect 数据中存在的那些列。

genelist <- c('wb02', 'wb03', 'wb06', 'a')
library(dplyr)
df %>% mutate(sum_genelist = rowSums(select(., any_of(genelist))))

#  names wb01 wb02 wb03 wb04 wb05 wb06 sum_genelist
#1     a    1    0    0    1    1    1            1
#2     b    1    0    0    1    0    1            1
#3     c    0    0    1    0    1    1            2
#4     d    1    0    1    1    0    1            2
#5     e    1    1    1    1    0    1            3
#6     f    0    1    1    1    1    1            3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多