我有一个数据框:
V1 V2 V3 V4 V5 V6 V7
a F B C D B A T
b R D C D F A T
c A C C R F A T
在每一行中,我想替换列V3中的值:V7将列V2与列V1中的值匹配。它看起来应该是这样的。
V1 V2 V3 V4 V5
a C D F A T
b C R F A T
c A R F A T
我该怎么做?
答案 0 :(得分:3)
只要您的数据是字符串而不是因素,这应该有效:
for(i in 3:7){
j = data[,2]==data[,i]
data[j,i] = data[j,1]
}
答案 1 :(得分:3)
使用lapply
和ifelse
的组合,您可以执行以下操作:
mydf[,3:7] <- lapply(mydf[,3:7], function(x) ifelse(x==mydf$V2, mydf$V1, x))
给出:
> mydf
V1 V2 V3 V4 V5 V6 V7
a F B C D F A T
b R D C R F A T
c A C A R F A T
或者:
newdf <- data.frame(sapply(mydf[,3:7], function(x) ifelse(x==mydf$V2, mydf$V1, x)))
给出:
> newdf
V3 V4 V5 V6 V7
1 C D F A T
2 C R F A T
3 A R F A T
答案 2 :(得分:3)
以下是使用lapply
的另一种方法:
df[, 3:7] <- lapply(df[,3:7], function(i) {i[i == df$V2] <- df$V1[i == df$V2]; i})
df
V1 V2 V3 V4 V5 V6 V7
a F B C D F A T
b R D C R F A T
c A C A R F A T
对于每个变量,使用子集替换匹配。
同样的方法可以用于replace
函数:
df[, 3:7] <- lapply(df[,3:7],
function(i) replace(i, i == df$V2, df$V1[i == df$V2]))
与@ mr-rip的解决方案一样,这些变量必须存储为字符,而不是存储的因素。
答案 3 :(得分:1)
这也适用于data.table
:
library(data.table)
setDT(df)[, lapply(.SD, function(col) ifelse(col == V2, V1, col))][, V3:V7, with=F]
# V3 V4 V5 V6 V7
# 1: C D F A T
# 2: C R F A T
# 3: A R F A T