r - 替换列中的值

时间:2016-06-27 20:21:18

标签: r replace row

我有一个数据框:

    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

我该怎么做?

4 个答案:

答案 0 :(得分:3)

只要您的数据是字符串而不是因素,这应该有效:

for(i in 3:7){
  j = data[,2]==data[,i]
  data[j,i] = data[j,1]
}

答案 1 :(得分:3)

使用lapplyifelse的组合,您可以执行以下操作:

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