【问题标题】:Add missing rows within combinations of factors在因子组合中添加缺失的行
【发布时间】:2017-11-11 12:54:14
【问题描述】:

我有一个可能最好近似为的数据框:

library(data.table)
z <- rep("z",5)
y <- c(rep("st",2),rep("co",2),"fu")
var1 <- c(rep("a",2),rep("b",2),"c")
var2 <- c("y","y","y","z","x")
transp <- c("bus","plane","train","bus","bus")
sample1 <- sample(1:10, 5)
sample2 <- sample(1:10, 5)
df <- cbind(z,y,var1,var2,transp,sample1,sample2)
df<-as.data.table(df)
> df
   z  y var1 var2 transp sample1 sample2
1: z st    a    y    bus       4       3
2: z st    a    y  plane      10       7
3: z co    b    y  train       8       9
4: z co    b    z    bus       1       5
5: z fu    c    x    bus       6       4

表中已存在 var1 和 var2 的所有唯一组合。我想扩展表格,以便 var1/var2 的所有组合都包含在列表中找到的所有 transp 选项:

transtype <- c("bus","train")

注意“plane”是 df 中的一个选项,但不是 transtype。我想保留包含 transp="plane" 但不通过添加带有“plane”的行来扩展的行。 z 和 y 列需要填写适当的值,并且 sample1 和 sample2 应该是 NA。结果应该是:

    > result
   z  y var1 var2 transp sample1 sample2
1: z st    a    y    bus       4       3
2: z st    a    y  plane      10       7
3: z st    a    y  train      NA      NA
4: z co    b    y  train       8       9
5: z co    b    y    bus      NA      NA
6: z co    b    z    bus       1       5
7: z co    b    z  train      NA      NA
8: z fu    c    x    bus       6       4
9: z fu    c    x  train      NA      NA

我基于Fastest way to add rows for missing values in a data.frame?Data.table: Add rows for missing combinations of 2 factors without losing associated descriptive factors 提出的data.table 选项最终扩展了var1 和var2 的所有唯一组合,而不仅仅是表中已经存在的组合。而且我不知道如何保持 z 和 y 的值。像这样:

setkey(df, var1, var2, transp)
x<-df[CJ(var1, var2, transp, unique=T)]

也许我应该使用 dplyr?或者,也许我错过了一些简单的东西?我浏览了 data.table 文档,但找不到解决方案。

【问题讨论】:

  • 所以,对于(z, y, var1, var2)的每个独特组合...如果没有公共汽车或火车的实例,则将其添加到NA?
  • 继承 z 和 y 的困难在于决定使用单个表而不是多个表。您想保留它们,因为它们是与(显然)var1 关联的属性。应该有一个包含该关系的单独表。

标签: r data.table dplyr


【解决方案1】:

要仅获取df 中已经存在的唯一组合,最好使用by 创建一个新的引用data.table,然后将其与原始的合并。

使用:

df2 <- df[, .(transp = transtype), by = .(var1,var2)]
merge(df, df2, by = c('var1','var2','transp'), all = TRUE)

给予:

   var1 var2 transp  z  y sample1 sample2
1:    a    y    bus  z st       4       3
2:    a    y  plane  z st      10       7
3:    a    y  train NA NA      NA      NA
4:    b    y    bus NA NA      NA      NA
5:    b    y  train  z co       8       9
6:    b    z    bus  z co       1       5
7:    b    z  train NA NA      NA      NA
8:    c    x    bus  z fu       6       4
9:    c    x  train NA NA      NA      NA

如果您的 zy 列没有 NA-values,您可以这样做:

df2 <- df[, .(transp = transtype), by = .(var1,var2,z,y)]
merge(df, df2, by = c('var1','var2','transp','z','y'), all = TRUE)

给出:

   var1 var2 transp z  y sample1 sample2
1:    a    y    bus z st       4       3
2:    a    y  plane z st      10       7
3:    a    y  train z st      NA      NA
4:    b    y    bus z co      NA      NA
5:    b    y  train z co       8       9
6:    b    z    bus z co       1       5
7:    b    z  train z co      NA      NA
8:    c    x    bus z fu       6       4
9:    c    x  train z fu      NA      NA

注意:如果zy 列对于每个var1/var2 组合具有多个唯一值,则最好使用zoo 包中的na.locf 来填充@ zy 列中的 987654336@ 值。


使用过的数据:

df <- fread("z  y var1 var2 transp sample1 sample2
 z st    a    y    bus       4       3
 z st    a    y  plane      10       7
 z co    b    y  train       8       9
 z co    b    z    bus       1       5
 z fu    c    x    bus       6       4")

【讨论】:

  • 是否应该将 z 和 y 包含在 df2 和随后的 by 语句中?这为示例产生了理想的输出,只是想知道方法是否应该更通用...问题是针对 tjr 的。
  • @pyll no,看问题中第一个代码块后面的描述
  • 好的,我现在明白了。您能否解释或指出有关代码中. 的一些文档?这件作品在做什么?
  • @pyll . 是 list 的 data.table 成语
  • 完美,感谢您的快速响应和良好的澄清 pyll。
【解决方案2】:

这是一个使用dplyrtidyr 的解决方案,特别是tidyr::completetidyr::nesting。后者对于使用数据集中的组合很有用,而complete 将为您提供所有组合。

library(dplyr)
library(tidyr)
df %>% 
  filter(transp %in% transtype)  %>%
  complete(nesting(z, y, var1, var2), transp) %>%
  union(df)
# A tibble: 9 <U+00D7> 7
      z     y  var1  var2 transp sample1 sample2
  <chr> <chr> <chr> <chr>  <chr>   <chr>   <chr>
1     z    st     a     y  plane      10      10
2     z    st     a     y  train    <NA>    <NA>
3     z    st     a     y    bus       1       9
4     z    fu     c     x  train    <NA>    <NA>
5     z    fu     c     x    bus       5       3
6     z    co     b     z  train    <NA>    <NA>
7     z    co     b     z    bus       6       6
8     z    co     b     y  train       3       2
9     z    co     b     y    bus    <NA>    <NA>

【讨论】:

  • 这也可以。为此类未来的问题提供两种解决方案总是好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多