【问题标题】:Multiples rows to one row in R [closed]R中的多行到一行[关闭]
【发布时间】:2021-05-14 05:09:07
【问题描述】:

在 R 中,我有一个包含多个值的数据框。我想要一个数据框,它将数据框转换为只有一行包含所有值的数据框。我有一个这样的数据框:

A     B      C    D    E    F    G
time  place  NA   NA   3    4    NA
time  place  1    NA   NA   4    5
time  place  NA   2    NA   NA   NA

我想要一个这样的数据框:

A     B      C    D    E    F    G
time  place  1    2    3    4    5

我尝试使用 reshape 函数,如下所示:Turning one row into multiple rows in r

并尝试了独特的功能,但我丢失了很多数据:Selecting unique rows in matrix using R

【问题讨论】:

  • 问题似乎没有明确说明:要么我们可以使用colMeans(..., na.rm=TRUE),要么发生其他事情。在这种情况下,如果您提供更好的minimale reproducible example,其他人会更容易帮助您。 MRE 将使其他人更容易找到和测试您的问题的答案。
  • A 列和 B 列的时间和地点组合是否不同?如果非 NA,C-G 列是否总是具有相同的值,还是可以变化?
  • A 和 B 完全一样。 C-G 可以变化
  • 好的,如果列 F 的值是 4 和 100,期望的输出是什么?
  • 这将是 4 和 100 的平均值

标签: r dplyr rows


【解决方案1】:

您可以将 na.omit() 与摘要一起使用,例如:

library(tidyverse)

df %>% group_by(A, B) %>% 
       summarise(C = mean(na.omit(C)),
                 D = mean(na.omit(D)),
                 E = mean(na.omit(E)),
                 F = mean(na.omit(F)),
                 G = mean(na.omit(G)))

您的示例数据在每列 C-G 中只有唯一值,因此根据您的评论,我使用 mean() 来获取非 NA 观察值的平均值。

数据:

df <- structure(list(A = c("time", "time", "time"), B = c("place",
"place", "place"), C = c(NA, 1L, NA), D = c(NA, NA, 2L), E = c(3L,
NA, NA), F = c(4L, 4L, NA), G = c(NA, 5L, NA)), class = "data.frame", row.names = c(NA,
-3L))

【讨论】:

    【解决方案2】:

    使用colMeans 解决不同值的解决方案:

    1.创建测试数据

    df <- structure(list(
      A = c("time", "time", "time"), 
      B = c("place", "place", "place"), 
      C = c(NA, 1L, NA), 
      D = c(NA, NA, 2L), 
      E= c(3L, NA, NA), 
      F = c(4L, 4L, NA), 
      G = c(NA, 5L, NA)), 
      row.names = c(NA, -3L),
      class = c("data.table", "data.frame"))
    

    2.将unique 用于前两列,colMeans 用于其余列,转换为 data.frame:

    cbind(unique(df[, 1:2]), as.data.frame.list(colMeans(df[,3:7], na.rm = TRUE)))
    

    返回:

          A     B C D E F G
    1: time place 1 2 3 4 5
    

    【讨论】:

      【解决方案3】:

      我们可以按'A'、'B'分组并选择第一个非NA元素across其他列

      library(dplyr)
      df1 %>%
           group_by(A, B) %>%
           summarise(across(everything(), ~ .[order(is.na(.))][1]), .groups = 'drop')
      

      -输出

      # A tibble: 1 x 8
      #  A     B         C     D     E     F     G H    
      #  <chr> <chr> <int> <int> <int> <int> <int> <lgl>
      #1 time  place     1     2     3     4     5 NA   
      

      coalesce

      library(purrr)
      df1 %>%
          group_by(A, B) %>% 
          summarise(across(everything(), ~ reduce(., coalesce)), .groups = 'drop')
      

      数据

      df1 <- structure(list(A = c("time", "time", "time"), B = c("place", 
      "place", "place"), C = c(NA, 1L, NA), D = c(NA, NA, 2L), E = c(3L, 
      NA, NA), F = c(4L, NA, NA), G = c(NA, 5L, NA), H = c(NA, NA, 
      NA)), class = "data.frame", row.names = c(NA, -3L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-15
        • 2017-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-15
        • 2019-01-31
        • 1970-01-01
        相关资源
        最近更新 更多