我想将数据框的多列替换为每个组的一列,同时我也想更改数字。示例:
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/