我有这样的 dataframe A:
Sample1
Salmon
Mouse
Rooster
Monkey
我的 dataframe B 如下所示:
Sample1 Sample2
Rooster Bird
Mouse Rodent
Salmon Fish
我希望在我的最终 dataframe 中,通过比较两个文件的两列之间的 match 来分配 sample2 列。为此,我使用了以下命令:
final_df$Sample2<- dataframe_B$Sample1[match(dataframe_A$Sample1, dataframe_B$Sample2)]
该命令有效,但是当没有替代品时,例如这里的猴子,则返回 NA。如果没有 match,如何修改我的代码以便返回相同的 value(例如猴子)?我的真实数据集有数千行。谢谢
简而言之,我的最终 dataframe 如下所示,我不希望为 Monkey 显示 NA,我希望 Monkey 在那里。这只是数千行的示例,我希望将相同的应用于任何没有 match 的内容:
Sample1 Sample2
Salmon Fish
Mouse Rodent
Rooster Bird
Monkey NA
回答1
我不确定您的问题是什么,但是 merge()
对您有用吗?
dataframe_A = data.frame(
stringsAsFactors = FALSE,
Sample1 = c("Salmon", "Mouse", "Rooster", "Monkey")
)
dataframe_B = data.frame(
stringsAsFactors = FALSE,
Sample1 = c("Rooster", "Mouse", "Salmon"),
Sample2 = c("Bird", "Rodent", "Fish")
)
dataframe_C = merge(
dataframe_A,
dataframe_B,
all.x = TRUE
)
dataframe_C$Sample2[is.na(dataframe_C$Sample2)] = dataframe_C$Sample1[is.na(dataframe_C$Sample2)]
dataframe_C
回答2
如果我理解正确,您可以像这样执行 left_join
:
library(dplyr)
df1 %>%
left_join(., df2, by = "Sample1")
输出:
Sample1 Sample2
1 Salmon Fish
2 Mouse Rodent
3 Rooster Bird
4 Monkey <NA>
数据
df1 <- data.frame(Sample1 = c("Salmon", "Mouse", "Rooster", "Monkey"))
df2 <- data.frame(Sample1 = c("Rooster", "Mouse", "Salmon"),
Sample2 = c("Bird", "Rodent", "Fish"))
回答3
如果
a <- data.frame(sample1 = c("Salmon", "Mouse", "Rooster", "Monkey"))
和
b <- data.frame(sample1 = c("Rooster", "Mouse", "Salmon"), sample2 = c("Bird", "Rodent", "Fish"))
然后
c <- c(a$sample1[match(b$sample1, a$sample1)], a$sample1[which(!a$sample1 %in% b$sample1)])
使用 which
和 !
过滤掉不匹配的那个
您可以将其放入 data.frame 中:
data.frame(c = c(a$sample1[match(b$sample1, a$sample1)], a$sample1[which(!a$sample1 %in% b$sample1)]))
c
1 Rooster
2 Mouse
3 Salmon
4 Monkey