R 如果一组不同的列相匹配,则用另一列填充一列中的空格
我有一个关于我在R中使用的一些数据的问题。我有两个数据帧。第二个数据帧是我想在第一个数据帧中进行的更改的列表R 如果一组不同的列相匹配,则用另一列填充一列中的空格,r,dataframe,match,R,Dataframe,Match,我有一个关于我在R中使用的一些数据的问题。我有两个数据帧。第二个数据帧是我想在第一个数据帧中进行的更改的列表 df1 date plot.no sp1 sp2 weight tag 1 14oct 06 green 70 1 2 14oct 05 yellow 63 2 3 14oct 04
df1
date plot.no sp1 sp2 weight tag
1 14oct 06 green 70 1
2 14oct 05 yellow 63 2
3 14oct 04 red red01 41 3
4 14oct 04 red 41 3
如果df1$sp1的颜色与df2$sp1中的颜色匹配,我想用df2$sp2中相应单元格中写入的内容填充df1$sp2的相应空白单元格。我不想覆盖df1$sp2中已经写入的内容
我尝试通过sp1列合并数据帧,我认为这会将sp2列添加到相应的条目中,但这似乎不起作用
这就是我希望数据帧在更改后的外观:
df.final
date plot.no sp1 sp2 weight tag
1 14oct 06 green orange 70 1
2 14oct 05 yellow yellow 63 2
3 14oct 04 red red01 41 3
4 14oct 04 red blue 41 3
不确定是否应该使用ifelse语句或循环来执行此操作?您可以在
df1
和df2
上执行左join
。将df1
中sp2
列中的空白单元格替换为NA
,并使用coalesce
获得第一个非NA值
library(dplyr)
df1 %>%
left_join(df2, by = 'sp1') %>%
mutate(sp2 = coalesce(replace(sp2.x, sp2.x == '', NA), sp2.y)) %>%
select(-sp2.x, -sp2.y)
也可以使用
ifelse
和match
在不加入base R的情况下执行此操作
df1$sp2 <- ifelse(df1$sp2 == '', df2$sp2[match(df1$sp1, df2$sp1)], df1$sp2)
df1
# date plot.no sp1 sp2 weight tag
#1 14oct 6 green orange 70 1
#2 14oct 5 yellow yellow 63 2
#3 14oct 4 red red01 41 3
#4 14oct 4 red blue 41 3
df1$sp2我首先将列df2$sp2
重命名为df2$sp2\u corr
,加入表,使用if语句,然后删除sp2\u corr列
在tidyverse中,它将是:
library(tidyverse)
df3 <- df2 %>%
rename(sp2_corr = sp2) %>%
left_join(df1, .) %>%
mutate(sp2 = if_else(sp2 == "", sp2_corr, sp2)) %>%
select(-sp2_corr)
> df3
date plot.no sp1 sp2 weight tag
1 14oct 6 green orange 70 1
2 14oct 5 yellow yellow 63 2
3 14oct 4 red red01 41 3
4 14oct 4 red blue 41 3
库(tidyverse)
df3%
重命名(sp2_corr=sp2)%>%
左联合(df1),%%>%
变异(sp2=if_-else(sp2==“”,sp2_-corr,sp2))%>%
选择(-sp2_corr)
>df3
日期绘图。编号sp1 sp2重量标签
2016年10月14日绿橙色70 1
2 2014年10月5日黄色63 2
3 2014年10月4日红色01 41 3
2014年10月4日红蓝41 3
我相信这是最好的解决方案:df1$col2如果您使用我在帖子下共享的数据并尝试我的答案,那么它确实会给您预期的答案。建议与dput
共享您的数据,这样我们可以确保答案适用于您的数据。也许你有因子列,如果你把它们改成字符,可能会有用。您还将空数据显示为'
,但实际上可能有NA
。两者之间有区别。如果不知道您正在使用的数据的详细信息,就无法真正确定
df1 <- structure(list(date = c("14oct", "14oct", "14oct", "14oct"),
plot.no = c(6L, 5L, 4L, 4L), sp1 = c("green", "yellow", "red",
"red"), sp2 = c("", "", "red01", ""), weight = c(70L, 63L,
41L, 41L), tag = c(1L, 2L, 3L, 3L)),
class = "data.frame", row.names = c("1", "2", "3", "4"))
df2 <- structure(list(sp1 = c("green", "red", "yellow"), sp2 = c("orange",
"blue", "yellow")), class = "data.frame", row.names = c("1",
"2", "3"))
library(tidyverse)
df3 <- df2 %>%
rename(sp2_corr = sp2) %>%
left_join(df1, .) %>%
mutate(sp2 = if_else(sp2 == "", sp2_corr, sp2)) %>%
select(-sp2_corr)
> df3
date plot.no sp1 sp2 weight tag
1 14oct 6 green orange 70 1
2 14oct 5 yellow yellow 63 2
3 14oct 4 red red01 41 3
4 14oct 4 red blue 41 3