比较多个列并在 R 中创建新列



我在重复的开始(A(和结束(B(有一个大的测量数据数据集。现在我想将数据行排序为"最后出现"(出现(和"仍然存在"(存在(,并将数据传递到新列中。

data<-data.frame(A1=c(1,2,4),
A2=c(3,5,4),
B1=c(10,0,5),
B2=c(1,0,1))

期望输出:

data_res<-data.frame(A1=c(1,2,4,0),
A2=c(3,5,4,0),
B1=c(10,0,5,1),
B2=c(1,0,1,2),
appeared1=c(0,0,0,1),
appeared2=c(0,0,0,2),
present1=c(10,0,5,0),
present2=c(1,0,1,0))

如您所见,如果数据最后出现,我希望 B 的输出在多列中,如果不是零应该传递。如果数据仍然存在,我还需要 B 的输出,如果不是零。 感谢您的帮助!

你可以用dplyr来做到这一点:

library(dplyr)
data<-data.frame(A1=c(1,2,4,0),
A2=c(3,5,4,0),
B1=c(10,0,5,1),
B2=c(1,0,1,2))
out<- mutate(data, appeared1 = if_else(A1 == 0, if_else(B1 != 0, B1, 0), 0))
out<- mutate(out, appeared2 = if_else(A2 == 0, if_else(B2 != 0, B2, 0), 0))
out<- mutate(out, present1 = if_else(A1 != 0, if_else(B1 != 0, B1, 0), 0))
out<- mutate(out, present2 = if_else(A2 != 0, if_else(B2 != 0, B2, 0), 0))

输出:

> out
A1 A2 B1 B2 appeared1 appeared2 present1 present2
1  1  3 10  1         0         0       10        1
2  2  5  0  0         0         0        0        0
3  4  4  5  1         0         0        5        1
4  0  0  1  2         1         2        0        0

如果有更多列,可以使用 for 循环:

out <- data
for (i in 1:2){
var1 = paste0('appeared',i)
var2 = paste0('present',i)
Ai <- paste0('A',i)
Bi <- paste0('B',i)
out<- mutate(out,  !!var1 := if_else( !!sym(Ai) == 0, if_else(!!sym(Bi) != 0, !!sym(Bi), 0), 0))
out<- mutate(out, !!var2 := if_else(!!sym(Ai) != 0, if_else(!!sym(Bi)!= 0, !!sym(Bi), 0), 0))
}

请记住根据您拥有的重复数量更改 for 循环中的范围。

相关内容

  • 没有找到相关文章

最新更新