Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果一组不同的列相匹配,则用另一列填充一列中的空格_R_Dataframe_Match - Fatal编程技术网

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

我有一个关于我在R中使用的一些数据的问题。我有两个数据帧。第二个数据帧是我想在第一个数据帧中进行的更改的列表

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