我正在使用 R 中的单个数据框,其中包含以下字符列和值。
C1<-c("1","2","3","4","5")
C2<-c("x", "t", "u", "r", "j")
C3<-c("2","5","3","1","4")
C4<-c("3","1","NA", "2","5")
df<-data.frame(C1,C2,C3,C4)
我正在尝试编写代码来替换 C3 和 C4 中的值,如下所示:
初始数据框如下所示:
最终的数据框应如下所示:
我还没有想出可以完成这项任务的代码(基础 R 或 Dplyr)。如果有人可以提供帮助,我将不胜感激。
谢谢!
这是一个新的 df,我尝试使用受访者提供的代码进行操作(例如,df[c("C3", "C4")] <- lapply(df[c("C3", " C4")], 函数(x) df$C2[match(x, df$C1)])).
我要返回 C3 C4 的所有 NA,但不明白为什么。 C3和C1之间存在匹配。
答案 0 :(得分:0)
我们可以使用match
df[c("C3", "C4")] <- lapply(df[c("C3", "C4")], function(x) df$C2[match(x, df$C1)])
答案 1 :(得分:0)
我也使用了 match
,但将其拆分为两个不同的语句以更清楚地说明发生了什么:
# Create sample data
C1<-c("1","2","3","4","5")
C2<-c("x", "t", "u", "r", "j")
C3<-c("2","5","3","1","4")
C4<-c("3","1","NA", "2","5")
df<-data.frame(C1,C2,C3,C4)
# Make replacements
df$C3_mod <- ifelse(is.na(df$C3), df$C3, df$C2[match(df$C3, df$C1)])
df$C4_mod <- ifelse(is.na(df$C4), df$C4, df$C2[match(df$C4, df$C1)])
# View results
df
# C1 C2 C3 C4 C3_mod C4_mod
# 1 1 x 2 3 t u
# 2 2 t 5 1 j x
# 3 3 u 3 NA u <NA>
# 4 4 r 1 2 x t
# 5 5 j 4 5 r j
答案 2 :(得分:0)
将 match
与矩阵一起使用。
cols <- c('C3', 'C4')
df[cols] <- df$C2[match(as.matrix(df[cols]), df$C1)]
df
# C1 C2 C3 C4
#1 1 x t u
#2 2 t j x
#3 3 u u <NA>
#4 4 r x t
#5 5 j r j
答案 3 :(得分:0)
我解决了 NA 值的问题。事实证明,我没有考虑的列值中有空格。再次感谢大家的回答。我在这个过程中学到了很多东西。