【问题标题】:Combining rows with duplicate values and NAs [without using tidyverse] [duplicate]组合具有重复值和 NA 的行 [不使用 tidyverse] [重复]
【发布时间】:2019-08-12 11:32:49
【问题描述】:

我有一个数据框,每个 ID 有多行。我想组合这些行以获得每个 ID 的 1 行,并组合可以是 numberNA 的各自值(我想忽略)。

我不确定我是否可以在这里使用 aggregate();一般来说,如果有一个不是NA 的值,我希望将列(V1-V4)中的每个 ID 值设置为一个数字。

输入:

    ID V1 V2 V3 V4
1  04C  6 NA NA  9
2  04C NA  9 NA  9
3  0F0 NA  5 NA  4
4  0F0 NA NA  7  4
5  0F0 NA  5  7 NA
6  167  8 NA NA NA
7  167  8 10  5 NA
8  167  8 10 NA NA
9  167  8 NA  5 NA
10 2D7  3  3 NA  1

输出:

   ID V1 V2 V3 V4
1 04C  6  9 NA  9
2 0F0 NA  5  7  4
3 167  8 10  5 NA
4 2D7  3  3 NA  1

我想出了一个解决方案,不幸的是它很慢,但至少它避免了创建一个小标题。

for(i in 2:nrow(df)) {
   row0 <- df[i-1,1]
   row1 <- df[i,1]  
   if (row0==row1) {
      for(j in 2:5) {
         if (is.na(df[i,j])) {
            df[i,j] <- df[i-1,j]
         }
      }
      df[i-1,1] <- "NA"
   }
}
dfclean <- subset(df, V0!="NA")

【问题讨论】:

标签: r aggregate


【解决方案1】:

也可以去:

library(dplyr)

df %>%
  group_by(ID) %>%
  summarise_all(~ if (any(!is.na(.))) first(na.omit(.)) else NA)

输出:

# A tibble: 4 x 5
  ID       V1    V2    V3    V4
  <fct> <int> <int> <int> <int>
1 04C       6     9    NA     9
2 0F0      NA     5     7     4
3 167       8    10     5    NA
4 2D7       3     3    NA     1

【讨论】:

    【解决方案2】:

    tidyverse 的一种可能是:

    df %>%
     gather(var, val, -ID, na.rm = TRUE) %>%
     group_by(ID, var) %>%
     distinct(val) %>%
     spread(var, val)
    
      ID       V1    V2    V3    V4
      <chr> <int> <int> <int> <int>
    1 04C       6     9    NA     9
    2 0F0      NA     5     7     4
    3 167       8    10     5    NA
    4 2D7       3     3    NA     1
    

    【讨论】:

    • tidyverse很有意思,谢谢。我当然必须先安装它,还要安装bindrcpp
    • 效果很好,但如何将输出保存到新的数据框?
    • df_new &lt;- df %&gt;% ...
    猜你喜欢
    • 2018-05-17
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    相关资源
    最近更新 更多