【问题标题】:R Add missing columns AND rows of data (Dplyr/TidyR & Complete?)R 添加缺失的列和数据行(Dplyr/TidyR & Complete?)
【发布时间】:2017-03-23 14:23:07
【问题描述】:

我已经习惯于为数据添加缺失的案例,但是这个用例让我无法理解。

我有许多数据框(略有不同),例如:

> t1
  3 4 5
2 1 0 0
3 0 2 2
4 2 6 4
5 1 2 1

structure(list(`3` = c(1L, 0L, 2L, 1L), `4` = c(0L, 2L, 6L, 2L
), `5` = c(0L, 2L, 4L, 1L)), .Names = c("3", "4", "5"), row.names = c("2", 
"3", "4", "5"), class = "data.frame")

行名和列名应该从 1:5 开始,显然,这些都缺少设置为 NA 的单元格值。对于上面的示例,这将给出:

> t1
  1  2  3  4  5
1 NA NA NA NA NA
2 NA NA 1  0  0
3 NA NA 0  2  2
4 NA NA 2  6  4
5 NA NA 1  2  1 

在每种情况下,都可能缺少任何一行或多行 AND/OR 列。

我可以使用 Josh O'Brien here 描述的方法轻松获取缺失的列,但我缺少 row 方法。

谁能帮忙?

【问题讨论】:

  • base R,你可以做m1 <- matrix(NA, ncol=5, nrow=5, dimnames = list(1:5, 1:5)); m1[row.names(t1), colnames(t1)] <- unlist(t1)
  • 哇。这是一种超级有效的方法。我刚刚设法弄清楚如何在行名上使用 setdiff 。但仍然是 1 行脚本而不是大约 8 行!谢谢阿克伦(一如既往)

标签: r dplyr tidyr


【解决方案1】:

我们可以用base R 以更简单的方式做到这一点,方法是创建所需尺寸的 NA 的matrix,然后根据“t1”的行名和列名分配“t1”的值

m1 <- matrix(NA, ncol=5, nrow=5, dimnames = list(1:5, 1:5))
m1[row.names(t1), colnames(t1)] <- unlist(t1)
m1
#   1  2  3  4  5
#1 NA NA NA NA NA
#2 NA NA  1  0  0
#3 NA NA  0  2  2
#4 NA NA  2  6  4
#5 NA NA  1  2  1

或使用tidyverse

library(tidyverse)
rownames_to_column(t1, "rn") %>% 
      gather(Var, Val, -rn) %>% 
      mutate_at(vars(rn, Var), as.integer) %>%
      complete(rn = seq_len(max(rn)), Var = seq_len(max(Var))) %>% 
      spread(Var, Val)
# A tibble: 5 × 6
#     rn   `1`   `2`   `3`   `4`   `5`
#* <int> <int> <int> <int> <int> <int>
#1     1    NA    NA    NA    NA    NA
#2     2    NA    NA     1     0     0
#3     3    NA    NA     0     2     2
#4     4    NA    NA     2     6     4
#5     5    NA    NA     1     2     1

【讨论】:

    【解决方案2】:

    根据您提到的 Josh O'Brien 的解决方案,您可以执行相同的操作,但使用 rownames 而不是 names。看看下面的代码..

    df <- data.frame(a=1:4, e=4:1)
    colnms <- c("a", "b", "d", "e") 
    rownms <- c("1", "2", "3", "4", "5")
    rownames(df) <- c("1", "3", "4", "5")
    
    ## find missing columns and replace with zero, and order them
    Missing <- setdiff(colnms, names(df))
    df[Missing] <- 0
    df <- df[colnms]
    df
    
    ## do the same for rows
    MissingR <- setdiff(rownms, rownames(df))
    df[MissingR,] <- 0
    df <- df[rownms,]
    df
    
    # > df
    #  a b d e
    #1 1 0 0 4
    #2 0 0 0 0
    #3 2 0 0 3
    #4 3 0 0 2
    #5 4 0 0 1
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2017-02-05
      相关资源
      最近更新 更多