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)]
这个线程可能对您正在做的事情也有帮助:
我想在 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)]
这个线程可能对您正在做的事情也有帮助: