jO.*_*jO. 1 replace r pattern-matching dataframe
我试图匹配一列中的特定值,并将其替换为另一列(同一行)中的相应值.这可能是很容易的......我一直在试图找到一个解决方案for loop
,sub
,subset
,data.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)
}
Run Code Online (Sandbox Code Playgroud)
输出就像这样;
X1 X2
1 D a
2 H W
3 Q E
4 F a
5 U P
6 B a
Run Code Online (Sandbox Code Playgroud)
(不需要开关).这是我感兴趣的第一栏.
任何指针都将不胜感激,谢谢!
有几种选择.这是三个:
df[ df$X1 == "a" , "X1" ] <- df[ df$X1 == "a", "X2" ]
Run Code Online (Sandbox Code Playgroud)
with
:df$X1 <- with( df, ifelse( X1 == "a", X2, X1 ) )
Run Code Online (Sandbox Code Playgroud)
library(data.table) ## >= 1.9.0
setDT(df) ## converts to data.table by reference, no need for `<-`
df[ X1 == "a", X1 := X2 ]
Run Code Online (Sandbox Code Playgroud)