将列中的值替换为同一数据帧中另一列的相应值

时间:2014-04-02 14:23:35

标签: r replace dataframe pattern-matching

我试图匹配一列中的特定值,并将其替换为另一列(同一行)中的相应值。这可能非常简单......我一直在尝试使用for loopsubsubsetdata.table找到解决方案,但我没有成功。必须有一个巧妙的方法来做到这一点。

示例数据,我们的目标是在第一列中交换a,并在第二列中使用相应的值并再次输出该列。

df <- data.frame(rbind(c('a','D'),c('H','W'),c('Q','E'),c('a','F'),c('U','P'),c('a','B')))

df$X1 <- as.character(df$X1)
df$X2 <- as.character(df$X2)

# not working
for (i in seq_along(df$X1)){
  a <- df$X1[i]
  b <- df$X2[i]
  x <- ifelse(a[i=='a'], a[i]<-b[i], do.nothing )
  print(x)
}

输出将是这样的;

   X1 X2
1  D  a
2  H  W
3  Q  E
4  F  a
5  U  P
6  B  a

(开关不是必需的)。这是我感兴趣的第一栏。

任何指针都会受到赞赏,谢谢!

2 个答案:

答案 0 :(得分:6)

有几种选择。这是三个:

最基本的,使用data.frames:

df[ df$X1 == "a" , "X1" ] <- df[ df$X1 == "a", "X2" ]

更多Terse,使用with

df$X1 <- with( df, ifelse( X1 == "a", X2, X1 ) )

最简洁透明使用data.tables

library(data.table) ## >= 1.9.0
setDT(df)           ## converts to data.table by reference, no need for `<-`

df[ X1 == "a", X1 := X2 ]

答案 1 :(得分:1)

如果您有多个条件(对于值向量交换"a"),这是另一种方法。

> find.a <- df$X1 %in% "a"
> df[find.a, "X1"] <- df[find.a, "X2"]
> df
  X1 X2
1  D  D
2  3  W
3  Q  E
4  F  F
5  U  P
6  B  B