【问题标题】:Are there alternative r base functions to pivot_wider?是否有替代 pivot_wider 的 r 基函数?
【发布时间】:2021-05-31 17:53:22
【问题描述】:

我有以下类型的表格:

SEZ Class Val
1_1_1 1 2
1_1_1 5 2
1_1_2 5 2
1_1_3 1 1
1_1_3 5 2
1_1_4 1 1
1_1_5 2 1
1_2_1 1 2
1_2_1 5 2

为了在多个新列中传播“类”列,从“Val”列中获取值,我使用了 pivot_wider,一切顺利。我输入了这个代码:

pivot_wider(names_from = Class, values_from = Val, names_sort=T, values_fill = list(n = 0))

得到这样的结果:

Sez 1 2 3 4 5 6 7
1_1_1 2 0 0 0 2 0 0
1_1_2 0 0 0 0 2 0 0
1_1_3 1 0 0 0 2 0 0

不幸的是,我必须使用仅存在基本 R 包的外部计算机,并且请求额外包的时间并不短。

我尝试使用此解决方案:

newdata <- xtabs(dat$Val ~ dat$Sez + dat$Class)

但它给了我每行的频率分布:

SEZ Class Freq
1_1_1 1 2
1_1_2 1 0
1_1_3 1 1
1_1_4 1 1
1_1_5 1 0
1_2_1 1 1

我正在寻找一种具有 R 基本功能的解决方案,它为我提供了一个与使用 pivot_wider 相同的对象。

【问题讨论】:

    标签: r pivot


    【解决方案1】:

    我们将“类”创建为factor 并使用xtabs

    df1$Class <- factor(df1$Class, levels = 1:7)
    
     xtabs(Val ~ SEZ + Class, df1)
    

    -输出

          Class
    SEZ     1 2 3 4 5 6 7
      1_1_1 2 0 0 0 2 0 0
      1_1_2 0 0 0 0 2 0 0
      1_1_3 1 0 0 0 2 0 0
      1_1_4 1 0 0 0 0 0 0
      1_1_5 0 1 0 0 0 0 0
      1_2_1 2 0 0 0 2 0 0
    

    如果我们需要data.frame 输出

    out <- as.data.frame.matrix( xtabs(Val ~ SEZ + Class, df1))
    out$SEZ <- row.names(out)
    row.names(out) <- NULL
    

    数据

    df1 <- structure(list(SEZ = c("1_1_1", "1_1_1", "1_1_2", "1_1_3", "1_1_3", 
    "1_1_4", "1_1_5", "1_2_1", "1_2_1"), Class = c(1L, 5L, 5L, 1L, 
    5L, 1L, 2L, 1L, 5L), Val = c(2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 
    2L)), row.names = c(NA, -9L), class = "data.frame")
    

    【讨论】:

    • 您好,非常感谢您的回复。您的解决方案非常好,但是当我尝试创建一个新变量时: new_variable
    • @Antonio 你需要更新中的输出吗
    • Akrun 你的解决方案是我试图从数据中得到的,它运作良好!非常感谢!!
    【解决方案2】:

    另一个使用 reshape + merge 的基本 R 选项

    reshape(
      merge(df,
        expand.grid(
          SEZ = unique(df$SEZ),
          Class = 1:7
        ),
        all = TRUE
      ),
      direction = "wide",
      idvar = "SEZ",
      timevar = "Class"
    )
    

    给予

         SEZ Val.1 Val.2 Val.3 Val.4 Val.5 Val.6 Val.7
    1  1_1_1     2    NA    NA    NA     2    NA    NA
    8  1_1_2    NA    NA    NA    NA     2    NA    NA
    15 1_1_3     1    NA    NA    NA     2    NA    NA
    22 1_1_4     1    NA    NA    NA    NA    NA    NA
    29 1_1_5    NA     1    NA    NA    NA    NA    NA
    36 1_2_1     2    NA    NA    NA     2    NA    NA
    

    【讨论】:

    • 您好 Thomas,感谢您的回答和解决方案!
    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 2021-10-08
    • 2011-06-20
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多