R:如果存在于另一个数据框中则替换值

R: Replacing values if present in another dataframe

我想在 R 中可视化多个数据集。不幸的是,数据集之间的命名不一致或使用同义词(例如,“apple”拼写为“apple”、“Apple”和“APPLE”)。

我有一个跨数据集引用命名法的数据框:

Name Dataset A Name Dataset B Name Dataset C
Apple APPLE apple
Pear PEAR NA
Melon NA melon

我想让事情保持一致,例如遍历数据集 B 和 C,并将它们的命名法替换为数据集 A 的命名法(如果可用)。有人有什么建议吗?

提前致谢!

如果你只想修改一些字符的大小写,或许你可以将数据转换成一个列表,然后递归地应用一个函数。你可以尝试这样的事情:

df = data.frame(col1 =c("Apple", "Pear", "Melon"))

df1 = data.frame(col1 =c("APPLE", "PEAR", NA))

df2 = data.frame(col1 =c("apple", NA, "melon"))

dflist = mget(ls(pattern = "df")) # Put all the data frames in a list

然后您可以将函数应用于每个元素,例如,使用 rapply

将所有单词转换为小写
thelist = rapply(dflist, tolower, how = "list")

输出

$df
$df$col1
[1] "apple" "pear"  "melon"


$df1
$df1$col1
[1] "apple" "pear"  NA     


$df2
$df2$col1
[1] "apple" NA      "melon"

可以对列表应用其他字符串操作,例如,搜索模式并使用 gsub()lapply():

进行替换
thelist2 = lapply(thelist, "[[", "col1") |> # Extracting "col1"
    lapply(\(x) gsub('apple', 'pink lady', x)) # Replace 'apple' with 'pink lady'

输出

$df
[1] "pink lady" "pear"      "melon"    

$df1
[1] "pink lady" "pear"      NA         

$df2
[1] "pink lady" NA          "melon"  

您也可以使用类似的方法 rapply:

thelist3 = rapply(thelist, \(x) gsub('apple', 'pink lady', x), how = 'list')

根据您的数据结构,您还可以加入数据框,然后根据需要应用函数。

如果您有这样的姓名和数据:

df_names = data.frame(names_for_a = c("apple", "orange"),
                      names_for_b = c("pink lady", "ORANGE"))
df_b = data.frame(index = 1:9, name = rep(c("pink lady", "ORANGE", "ORANGE"), 3))

我会这样做:

df_b$name = df_names$names_for_a[match(df_b$name, df_names$names_for_b)]

这个线程可能对您正在做的事情也有帮助: