我有两个数据框x和y。
x<-data.frame("j"=c("A","B","C"),"k"=c(1,90,14))
x j k
1 A 1
2 B 90
3 C 14
y<-data.frame("A"=c(1,0,0,1,1),"B"=c(0,1,0,0,1),"C"=c(1,1,1,0,0))
A B C
1 1 0 1
2 0 1 1
3 0 0 1
4 1 0 0
5 1 1 0
我需要一个带条件语句的函数,其中如果在数据集y中有0,则替换为-1或1在A列中替换为1,依此类推以获得此结果。
z<-data.frame("A"=c(1,-1,-1,1,1),"B"=c(-90,90,-90,-90,90),"C"=c(14,14,14,-14,-14))
A B C
1 1 -90 14
2 -1 90 14
3 -1 -90 14
4 1 -90 -14
5 1 90 -14
答案 0 :(得分:1)
这是一个基本R中有趣的单行,它使用了许多有用的功能。
setNames(do.call(data.frame, Map(function(x, y) x * c(-1, 1)[y+1], x$k, y)), LETTERS[1:3])
A B C
1 1 -90 14
2 -1 90 14
3 -1 -90 14
4 1 -90 -14
5 1 90 -14
最内部函数x * c(-1, 1)[y+1]
取x的值(它是标量--1,9或14)并将其乘以负-1或1,具体取决于y的值。 / p>
Map
取x的x $ k值和y参数的data.frame y的变量,对每一对执行函数并返回一个列表。有三个向量。
此列表将转换为带do.call
的data.frame,变量名称随setNames
一起提供。