【问题标题】:How to merge dataframes and simultanously recode NA's based on values of other rows?如何合并数据帧并根据其他行的值同时重新编码 NA?
【发布时间】:2021-04-13 08:38:26
【问题描述】:

我想做一些应该相对容易的事情,但我发现这是不可能的。 (在 R 中相对较新)。

我有这两个数据集:

df1 <- data.frame("Basket" = c("W1", "W1"),          
             "Fruits" = c("apple", "banana"),
             "Color" = c("green", "yellow"),
             "Spanishfruit" = c("manzana", "platano"),
             "Spanishcolor" = c("verde", "amarillo"))

df <- data.frame("Basket" = c("W2", "W2", "W2"),          
              "Fruits" = c("apple", "banana", "grape"),
              "Color" = c("green", "yellow", "purple"),
              "Spanishfruit" = c(NA, NA, NA),
              "Spanishcolor" = c(NA, NA, NA))
             

首先,我想合并它们(我为此使用了 bind_rows),这是可行的。但是,我还想在第二个数据框中重新编码 NA,以便如果数据集之间的变量 fruit 和 color 相等(而变量篮子不相等),变量“Spanishfruit”和“Spanishcolour”(简单地翻译成西班牙语)是平等的。即,我只设法做到了这一点:

df3 <- data.frame("Round" = c("W1", "W1","W2", "W2", "W2" ),          
              "Fruits" = c("apple", "banana", "apple", "banana", "grape"),
              "Color" = c("green", "yellow", "green", "yellow", "purple"),
              "Spanishfruit" = c("manzana", "platano", NA, NA, NA),
              "Spanishcolor" = c("verde", "amarillo", NA, NA, NA)) 

但我想要的是这个。

df4 <- data.frame("Round" = c("W1", "W1","W2", "W2", "W2" ),          
              "Fruits" = c("apple", "banana", "apple", "banana", "grape"),
              "Color" = c("green", "yellow", "green", "yellow", "purple"),
              "Spanishfruit" = c("manzana", "platano", "manzana", "platano", NA),
              "Spanishcolor" = c("verde", "amarillo", "verde", "amarillo", NA))

到目前为止,我尝试了几件事,主要是结合了 mutate 和 case_when。我认为解决方案可能是在合并它们时合并和建立正确的键?我真的迷路了,无法在任何地方找到解决这个问题的方法。我想要的是,如果“水果”和“颜色”列中的值在 df1 的一行和 df2 的另一行中相等,当我合并它们时,来自 df2 的 rwo 中的“Spanishfruit”和“Spanishcolor”中的值等于 df1 中的行中的值,而变量篮子仍然不同。或者,换一种说法:如果跨行的两个变量的值相等,我希望两个变量的值也相等,同时保持另一个变量不同。

如果有人知道如何解决这个问题,我将非常感激。找到一个基于 tidyverse 的解决方案会更有帮助,但一切都会有所帮助。

谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    这是您要查找的输出吗?

    library(tidyverse)
    
    df1 <- data.frame("Basket" = c("W1", "W1"),          
                   "Fruits" = c("apple", "banana"),
                   "Color" = c("green", "yellow"),
                   "Spanishfruit" = c("manzana", "platano"),
                   "Spanishcolor" = c("verde", "amarillo"))
    
    df <- data.frame("Basket" = c("W2", "W2", "W2"),          
                  "Fruits" = c("apple", "banana", "grape"),
                  "Color" = c("green", "yellow", "purple"),
                  "Spanishfruit" = c(NA, NA, NA),
                  "Spanishcolor" = c(NA, NA, NA))
    
    df3 <-rbind(df, df1)
    
    df3 %>% group_by(Fruits) %>%
            mutate(Spanishfruit = zoo::na.locf(Spanishfruit, na.rm = FALSE, fromLast = TRUE),
                   Spanishcolor = zoo::na.locf(Spanishcolor, na.rm = FALSE, fromLast = TRUE)) %>%
           arrange(Basket, desc())
    #> # A tibble: 5 x 5
    #> # Groups:   Fruits [3]
    #>   Basket Fruits Color  Spanishfruit Spanishcolor
    #>   <fct>  <fct>  <fct>  <chr>        <chr>       
    #> 1 W2     apple  green  manzana      verde       
    #> 2 W2     banana yellow platano      amarillo    
    #> 3 W2     grape  purple <NA>         <NA>        
    #> 4 W1     apple  green  manzana      verde       
    #> 5 W1     banana yellow platano      amarillo
    

    reprex package (v0.3.0) 于 2021-01-07 创建

    【讨论】:

    • 您可能想要使用 na.locf0 代替,在这种情况下您不需要 na.rm 参数。
    • 感谢您的回答!您的解决方案看起来很有希望。不幸的是,由于某种原因我仍然没有得到,它不适用于我的真实数据集。问题似乎是,当我必须根据几个变量(它们是字符串字符)进行分组时,由于某种原因,R 不会识别字符串字符相等,因此不会进行适当的分组。很不幸,但您的解决方案在未来仍然非常有用。谢谢!
    • 那太糟糕了。如果您可以在这种方法失败的地方分享更多数据,我相信我或这里的其他人可以提供帮助。
    猜你喜欢
    • 2018-02-27
    • 2020-10-24
    • 2023-01-19
    • 2022-09-23
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    相关资源
    最近更新 更多