【问题标题】:how to combine different data into one row?如何将不同的数据组合成一行?
【发布时间】:2021-08-17 15:06:52
【问题描述】:

我想将两个 ID 为“A”和“B”的数据帧“df”记录合并到 ID 为“C”(目标)的一行中。我知道矩阵 [ , ] 可以做这种工作。但在数据框中没有行号不可用。

以下是我的数据。

df

ID    Y1    Y2    Y3    Y4    Y5   Y6

A     7     4     NA    NA    NA    NA

B     NA    NA     5    5     4     4 

目标:

ID  Y1    Y2    Y3    Y4    Y5    Y6

C   7     4     5      5     4     4

【问题讨论】:

    标签: r row


    【解决方案1】:

    这行得通吗:

    as.data.frame(cbind(ID = 'C',t(apply(df[-1], 2, sum, na.rm = TRUE))))
      ID Y1 Y2 Y3 Y4 Y5 Y6
    1  C  7  4  5  5  4  4
    

    【讨论】:

      【解决方案2】:

      我们可以使用

       df1 %>%
         summarise(ID = 'C', across(where(is.numeric), na.omit))
       #  ID Y1 Y2 Y3 Y4 Y5 Y6
       #1  C  7  4  5  5  4  4
      

      数据

      df1 <- structure(list(ID = c("A", "B"), Y1 = c(7L, NA), Y2 = c(4L, NA
      ), Y3 = c(NA, 5L), Y4 = c(NA, 5L), Y5 = c(NA, 4L), Y6 = c(NA, 
      4L)), class = "data.frame", row.names = c(NA, -2L))
      

      【讨论】:

      • 感谢您的意见!在数据量很大的情况下,一一为变量赋值听起来既费时又不现实。
      • 很抱歉造成混淆。我的意思是你输入 Y1, Y2, .. 通过一个一个地组合数据会很耗时。
      • 对不起。我犯了一个错误。你说的对。您答案的第二部分是数据。感谢您的帮助!
      • 当然可以!对不起我的困惑。我是 R 中的新人。
      【解决方案3】:

      一些基本的 R 选项

      • colSums
      > cbind(ID = "C", data.frame(t(colSums(df[-1], na.rm = TRUE))))
        ID Y1 Y2 Y3 Y4 Y5 Y6
      1  C  7  4  5  5  4  4
      
      • na.omit + list2DF
      > list2DF(c(ID = "C", Map(na.omit, df[-1])))
        ID Y1 Y2 Y3 Y4 Y5 Y6
      1  C  7  4  5  5  4  4
      

      【讨论】:

        【解决方案4】:

        我们可以使用来自janitor 包的adorn_totals

        library(dplyr)
        library(janitor)
        df1 %>%
          adorn_totals("row") %>% 
          slice(3)
        

        输出:

            ID Y1 Y2 Y3 Y4 Y5 Y6
         Total  7  4  5  5  4  4
        

        【讨论】:

        • 有趣的解决方案。谢谢!
        【解决方案5】:

        如果在任何情况下,您有一对想要合并到彼此的行,您可以遵循这个简单的策略

        df <- structure(list(ID = c("A", "B", "C", "E"), Y1 = c(7L, NA, NA, 
                                                                7L), Y2 = c(4L, NA, 5L, NA), Y3 = c(NA, 5L, NA, 5L), Y4 = c(NA, 
                                                                                                                            5L, NA, 5L), Y5 = c(NA, 4L, 14L, NA), Y6 = c(NA, 4L, 5L, NA)), row.names = c(NA, 
        
                                                                                                                                                                                                                                                                                                                                                                                                          -4L), class = "data.frame")
        df
        #>   ID Y1 Y2 Y3 Y4 Y5 Y6
        #> 1  A  7  4 NA NA NA NA
        #> 2  B NA NA  5  5  4  4
        #> 3  C NA  5 NA NA 14  5
        #> 4  E  7 NA  5  5 NA NA
        library(dplyr)
        
        df %>% group_by(ID = (row_number()+1) %/% 2) %>%
          summarise(across(everything(), sum, na.rm =T))
        #> # A tibble: 2 x 7
        #>      ID    Y1    Y2    Y3    Y4    Y5    Y6
        #>   <dbl> <int> <int> <int> <int> <int> <int>
        #> 1     1     7     4     5     5     4     4
        #> 2     2     7     5     5     5    14     5
        

        reprex package (v2.0.0) 于 2021 年 5 月 30 日创建

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-20
          • 2014-10-12
          • 2020-11-10
          • 1970-01-01
          • 2020-12-25
          • 2018-10-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多