将多列按头字符串替换为一列

标签 r

我想将数据框的多列替换为每个组的一列,同时我也想更改数字。示例:

  A1 A2 A3 A4 B1 B2 B3
1  1  1  0  1  1  0  0
2  1  0  1  1  0  1  1
3  1  1  1  1  0  1  1
4  0  0  1  0  0  0  1
5  0  0  0  0  0  1  0

我想按此数据框的标题对其进行排序,这意味着我只需要一列“A”而不是此处的 4 列,并且只需要“B”列而不是此处的 3 列。数字应按以下模式更改:如果您在“A2”组中,并且观察值的数字为“1”,则应将其更改为“2”。如果您在“A3”组中并且观察值的数字为“1”,则应将其更改为“3”。最终结果应该是我想要包含该特定列和行中的最高数字(如果我的行和组中有 3 个“1”,则将替换所有这些数字的数字将是最高组) 如果数字为 0,则不会发生任何变化。这是我正在寻找的结果:

  A B
1 4 1
2 4 3
3 4 3
4 3 3
5 0 2

如何将所有这些组各替换为一列? (每组一栏)

到目前为止,我已经尝试了很多功能,例如,unite(data= testdata, col= "A"),但是手动执行此操作会花费太长时间。一定有更好的方法,对吗?

提前致谢!

最佳答案

你可以这样做:

dat <- read.table(header=TRUE, text=
 "A1 A2 A3 A4 B1 B2 B3
1  1  1  0  1  1  0  0
2  1  0  1  1  0  1  1
3  1  1  1  1  0  1  1
4  0  0  1  0  0  0  1
5  0  0  0  0  0  1  0")

myfu <- function(x) if (any(x)) max(which(x)) else 0

new <- data.frame(
 A=apply(dat[, 1:4]==1, 1, myfu),
 B=apply(dat[, 5:7]==1, 1, myfu))
new

更通用的解决方案:

new2 <- data.frame(
  A=apply(dat[, grepl("^A", names(dat))]==1, 1, myfu),
  B=apply(dat[, grepl("^B", names(dat))]==1, 1, myfu))
new2

关于将多列按头字符串替换为一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61730276/

相关文章:

r - 确定 R 中分布的高密度区域

c++ - runif 的性能

regex - R中的gsub和regex遇到问题

python - rpy2 rmagic 用于 ipython 将数据帧列名称中的破折号转换为点

r - 如何使用 R 中的动画构建 Shiny 的应用程序?

r - 在R中,如何真正快速地遍历数据帧的行?

c++ - R 和 C++ 中的相同计算返回不同的结果?

regex - 将 dd/mm/yy 和 dd/mm/yyyy 转换为日期

r - 在 R 中,从字符串中删除除最后一个之外的所有点

r - R项目中的数据操作: compare rows