【问题标题】:Merge 2 dataframes and updating column values in R [duplicate]合并2个数据框并更新R中的列值[重复]
【发布时间】:2020-10-19 09:44:14
【问题描述】:

我有 2 个数据框,

R1 <- c("15515","5156","65656","1566", "2857")
RC <- c("A","X","B","Z","A")
R2 <- c("515","5156.11-","415-","1455-","886")
df <- data.frame(R1,RC,R2)

R1 <- c("15515","8888","65656","1566")
R2 <- c("111","222","333","444")
R3 <- c("999","888","777","666")
df2 <- data.frame(R1,R2,R3)

我需要先左加入 R1 上的 df,

要达到的条件,

1. if df$R1 != df2$R1
  df$R2 <- df$R2  (As it is in df)
  
2. if df$R1 == df2$R1 & (df$RC == A | df$RC == B) then,
  df$R2 <- df2$R2
  
3. if df$R1 == df2$R1 & (df$RC != A | df$RC != B) then,
  df$R2 <- df2$R3

输出可能看起来像

 R1        RC        R2
15515      A        111
5156       X        5156.11-
65656      B        333
1566       Z        666
2857       A        886

我尝试执行以下代码,

df$R1[which(df$R1 == df2$R1) & which((df$RC == 'A' | df$RC == 'B'))] <- df2$R2[which(df$R1 == df2$R1) & which((df$RC == 'A' | df$RC == 'B'))]
df$R1[which(df$R1 == df2$R1) & which((df$RC != 'A' | df$RC != 'B'))] <- df2$R3[which(df$R1 == df2$R1) & which((df$RC != 'A' | df$RC != 'B'))]

但我因此失去了条件 1。

非常感谢您的帮助!

【问题讨论】:

  • 如果您使用的是
  • 我使用版本 1.1.383 – © 2009-2017 RStudio, Inc. 我相信数据从一开始就在因子中。不会没事吧?
  • dfdf2 的行数不同。你如何比较它们df$R1 == df2$R1
  • 嗨@RonakShah 我不完全确定,但我们可以先离开联接(df),然后逐个解决条件。不会有帮助吗?

标签: r merge


【解决方案1】:

您可以在R1 上加入dfdf2,并使用case_when 申请条件:

library(dplyr)

df %>%
  left_join(df2, by = 'R1') %>%
  mutate(R2 = case_when(is.na(R2.y) ~ R2.x, 
                        RC %in% c('A', 'B') ~ R2.y, 
                        TRUE ~ R3)) %>%
  select(names(df))

#     R1 RC       R2
#1 15515  A      111
#2  5156  X 5156.11-
#3 65656  B      333
#4  1566  Z      666
#5  2857  A      886

【讨论】:

  • 谢谢你,但我在一些 R2 列中得到 NA,R1 RC R2 1 15515 A 2 5156 X 5156.11- 3 65656 B 4 1566 Z 5 2857 A第886章
  • @Vin 请先将因子列转换为字符。您示例中的简单方法是df &lt;- data.frame(R1,RC,R2, stringsAsFactors = FALSE)df2 执行相同操作。或者,如果数据框已经创建,您也可以使用df[] &lt;- lapply(df, as.character) 将所有列转换为字符。
  • 不幸的是,它不适用于实际数据。我不确定为什么。最后,我在 R2 中得到与 df 中相同的值(实际数据不同),还有其他原因吗?
  • @Vin 您是否将结果分配回新对象? df1 &lt;- df %&gt;% left_join(df2, by = 'R1').... ?
  • 我认为某些R1 值可能在df1df2 中重复,这会增加行数。
【解决方案2】:

使用ifelse 可能更容易做到这一点。注意 df 和 df2 有不同的 nrows 所以会有一个警告:

df$R2 <- ifelse(df$R1 != df2$R1, df$R2,
  ifelse(df$R1 == df2$R1 & (df$RC == "A" | df$RC == "B"), df2$R2,
    ifelse(df$R1 == df2$R1 & (df$RC != "A" | df$RC != "B"), df2$R3, "X")
  )
)

也许您可以省略最后一个 ifelse,如果没有满足您的条件,它将打印和“X”。

我也在运行 R 版本 3.6.1,如果我不使用 stringsAsFactors=FALSE,我会收到一条错误消息。

【讨论】:

  • 我收到此代码错误,Ops.factor(df$R1, df2$R1) 中的错误:因子的级别集不同此外:警告消息:在 is.na(e1) | is.na(e2) : 较长的对象长度不是较短对象长度的倍数
猜你喜欢
  • 1970-01-01
  • 2017-10-31
  • 2019-02-06
  • 2019-11-22
  • 2018-09-04
  • 2022-01-25
  • 2020-09-04
  • 2020-11-30
  • 2019-03-04
相关资源
最近更新 更多