【问题标题】:Sum of columns with partial string match R具有部分字符串匹配 R 的列的总和
【发布时间】:2016-02-10 19:51:54
【问题描述】:

我想根据字符串值的部分匹配添加两列

a <- c("ChrM","ChrM","ChrM","ChrM","ChrM")
b <- c(5,6,7,10,11)
c <- c(0,0,3,0,1)
d <- c(2,1,0,1,0)

dfa <- data.table(a, b, c, d) 
colnames(dfa) <- c("ID","pos","cr H-MN-8A","cr H-MN-8B")
#I don't know how to make a column name with a string value (with " " and "_")
  ID     pos        cr H-MN-8A cr H-MN-8B
1 ChrM   5          0          2
2 ChrM   6          0          1
3 ChrM   7          3          0
4 ChrM  10          0          1
5 ChrM  11          1          0

我希望能够根据部分字符串匹配“cr H-MN-8”添加最后两列“cr H-MN-8A”、“cr H-MN-8B”,然后写入结果进入一列,同时还将其与一个值进行比较,因此返回是真或假。 我有类似的东西

dfa <- lapply(dfa, function(x) x[, newval := as.numeric(col1+col2>=1)])

我有两个以上带有标题的字符串匹配项(它们都在同一个数据帧上配对)。有任何想法吗?谢谢!

(不知道是否相关,但我使用的是data.table

【问题讨论】:

  • 我会回应这种观点“我觉得有必要补充一点,坚持使用空格的名字似乎很固执。这只会令人讨厌。”stackoverflow.com/questions/30757316/…
  • 预期输出是什么
  • @mtoto TRUE 或 FALSE,分别表示为 1 或 0
  • @Pierre Lafortune 这就是我必须使用的 :(
  • 我只是注意到它的意义为零。它更类似于newval := as.numeric(col1+col2&gt;=1)

标签: r string sum data.table match


【解决方案1】:

我们可以试试下面data.table的方法

dfa[,`H-MN-8` := as.numeric(rowSums(.SD) > 1), .SDcols = grep("cr H-MN-8", names(dfa))]

dfa
#     ID pos cr H-MN-8A cr H-MN-8B H-MN-8
#1: ChrM   5          0          2      1
#2: ChrM   6          0          1      0
#3: ChrM   7          3          0      1
#4: ChrM  10          0          1      0
#5: ChrM  11          1          0      0

【讨论】:

  • 专业提示:写+(rowSums(.SD) &gt; 1) 会更简洁地进行转换(如果有点模糊的话)
  • @MichaelChirico 越来越多的人反对 SO r-taggers。可读性 vs 简洁性等等
  • @PierreLafortune 我和你在一起——可能不建议留下一个充满内幕技巧的答案,尤其是在初学者的问题上。但也很高兴为这样的东西加上为好奇和无畏的人提供更清晰的答案;-)
  • 如果字符串发生变化(我有 8 个组)并且我想传输它(它存储在列表中的名称下)怎么办,这样我就不必为每个输入一个唯一的键一?就像我想选择 A 或 B 之前在组之间有所不同的所有内容,然后对唯一不同的是 A 或 B 的组进行操作。
  • 这是一个新问题,不在您原来的问题中。如果您有新问题,请发布一个新问题,而不是将其塞进 cmets。
猜你喜欢
  • 2021-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
相关资源
最近更新 更多