【问题标题】:Convert from long to wide format with multiple unique variables to other unique variables in R将具有多个唯一变量的长格式转换为R中的其他唯一变量
【发布时间】:2020-04-25 08:49:20
【问题描述】:

我正在尝试从长格式转换为宽格式,但多列表示唯一行。 在下面的示例中,block, density, species 列表示唯一的个人。每个人都有 2 或 3 行与面积和大小相关联。我想将区域和大小转换为宽格式。

这是我的数据集

block <- c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2)
species <- c("A","A","A","A","B","B","B","B","A","A","A","A","B","B","B","B","B")
den <- c("20","20","50","50","20","20","50","50","20","20","50","50","20","20","50","50","50")


block <- as.factor(block)
den <- as.factor(den)
species <- as.factor(species)

area <- c(1:17)
size <- c(17:33)

df <- data.frame(block, species, den, area, size)

我想最终数据集只有独特的个体

  block   species   den   area.1  area.2  area.3  size.1  size.2  size.3
    1        A       20     1       2       NA      17      18      NA
    1        A       50     3       4       NA      19      20      NA
    .....
    2        B       50     15      16      17      31      32      33

注意:我说服的其他答案不使用多列来表示行的唯一性

【问题讨论】:

  • 使用data.tablelibrary(data.table); setDT(df); dcast(df, block + species + den ~ rowid(block, species, den), value.var = c("area", "size"))

标签: r casting type-conversion reshape2


【解决方案1】:

我们可以在按组创建序列列后使用pivot_wider

library(dplyr)
library(tidyr)
df %>% 
    group_by(block, species, den) %>% 
    mutate(rn = row_number()) %>% 
    ungroup %>% 
    pivot_wider(names_from = rn, values_from = c(area, size), names_sep = ".")
# A tibble: 8 x 9
#  block species den   area.1 area.2 area.3 size.1 size.2 size.3
#  <fct> <fct>   <fct>  <int>  <int>  <int>  <int>  <int>  <int>
#1 1     A       20         1      2     NA     17     18     NA
#2 1     A       50         3      4     NA     19     20     NA
#3 1     B       20         5      6     NA     21     22     NA
#4 1     B       50         7      8     NA     23     24     NA
#5 2     A       20         9     10     NA     25     26     NA
#6 2     A       50        11     12     NA     27     28     NA
#7 2     B       20        13     14     NA     29     30     NA
#8 2     B       50        15     16     17     31     32     33

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多