【问题标题】:Merge data frame with conditions将数据框与条件合并
【发布时间】:2018-10-19 22:25:12
【问题描述】:

以下是我的数据框。

df1<-data.frame(month=c("march", "april"), apple=c(1,NA), peach=c(10,NA))
df2<-data.frame(month=c("march", "april"), apple=c(5,3), peach=c(NA,NA))

我希望 R 执行以下操作:

  • 如果两个数据帧中都存在单元格值 -(来自 df1 的单元格值)-(来自 df2 的单元格值)
  • 如果 df1 中的单元格值缺失但 df2 中的单元格值存在 - 写“first”
  • 如果 df2 中的单元格值缺失但 df1 中的单元格值存在 - 写“秒”
  • 如果两者都缺失 - 写“两者”

像这样:

我尝试了df1-df2,但是任何一个数据框都有 NA 的地方都被 NA 填充了。 然后我尝试使用应用功能,但无法真正弄清楚如何去做......

你能帮我解决这个问题吗?

【问题讨论】:

  • 在同一个变量中混合字符和数字很少有意义。我觉得你描述的是你解决问题的尝试,而不是问题本身。见XY Problem trap

标签: r if-statement merge conditional apply


【解决方案1】:

@Shree 的评论是绝对正确的:当您返回帧时,不要期望 -4 值是一个数字(它实际上是 "-4"。我将假设需要发生其他事情在这里,所以这是您认为需要的解决方案:-)

func <- function(a,b) {
  naa <- is.na(a)
  nab <- is.na(b)
  ifelse(naa,
         ifelse(nab, "both", "first"),
         ifelse(nab, "second", a-b))
}
mapply(func, df1[2:3], df2[2:3], SIMPLIFY=FALSE)
# $apple
# [1] "-4"    "first"
# $peach
# [1] "second" "both"  

我并不总是对嵌套的ifelse 感到满意,但这并不极端。对于dplyr::case_when,这可能是一个更好的机会,也许是以后的练习。

这可以直接应用回一个框架,例如:

df0 <- df1
df0[2:3] <- mapply(func, df1[2:3], df2[2:3], SIMPLIFY=FALSE)
df0
#   month apple  peach
# 1 march    -4 second
# 2 april first   both

但是(再次)正如@Shree 之前所说,你不会有数字:

str(df0)
# 'data.frame': 2 obs. of  3 variables:
#  $ month: Factor w/ 2 levels "april","march": 2 1
#  $ apple: chr  "-4" "first"
#  $ peach: chr  "second" "both"

【讨论】:

    【解决方案2】:

    我认为你正在寻找这样的东西

    ```{r}
    df1<-data.frame(month=c("march", "april"), apple=c(1,NA), peach=c(10,NA))
    df2<-data.frame(month=c("march", "april"), apple=c(5,3), peach=c(NA,NA))
    
    myconditions <- function(a, b) {
      if (is.na(a)) {
        if (is.na(b)) {
          "both"
        } else {
          "first"
        }
      } else {
        if(is.na(b)) {
          "second"
        } else {
          a - b
        }
      }
    }
    
    df1$apple[match(df2$month,df1$month)] <- mapply(myconditions,df1$apple,df2$apple)
    df1$peach[match(df2$month,df1$month)] <- mapply(myconditions,df1$peach,df2$peach)
    
    ```
    

    生成的矩阵将在 df1 中。

    我们从您在用户定义函数中定义的逻辑开始,然后将其应用于您要对其执行操作的向量,因此您在 apply 的正确轨道上。

    正如其他人所提到的,您正在混合字符串和整数,因此列的数据类型是字符向量,这可能不是您的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-19
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 2021-09-10
      • 2021-03-31
      • 2021-08-28
      相关资源
      最近更新 更多