【问题标题】:Convert R dataframe from long to wide format [duplicate]将R数据帧从长格式转换为宽格式[重复]
【发布时间】:2016-01-25 20:28:34
【问题描述】:

我有以下数据:

 df <- data.frame(left=letters[1:4], right=replicate(1,sample(0:100,12,rep=TRUE)))

我看起来像这样(数字可能不同,因为在随机函数上)

   left  right
1     a     6
2     b    97
3     c    78
4     d    28
5     a    61
6     b    58
7     c    56
8     d    28
9     a    90
10    b    83
11    c    72
12    d    17

第一列是表格的标题,重复 3 次。新的数据框应如下所示:

a  b  c  d
6  97 78 28
61 58 56 28
90 83 72 17

当我使用时

spread(df,left, right)

看起来像这样:

    a  b  c  d
1   6 NA NA NA
2  NA 97 NA NA
3  NA NA 78 NA
4  NA NA NA 28
5  61 NA NA NA
6  NA 58 NA NA
7  NA NA 56 NA
8  NA NA NA 28
9  90 NA NA NA
10 NA 83 NA NA
11 NA NA 72 NA
12 NA NA NA 17

有什么想法吗?

【问题讨论】:

  • 也许这会起作用:data.frame(a = df[which(df$left == 'a'),2], b = df[which(df$left == 'b'),2], c = df[which(df$left == 'c'),2], d = df[which(df$left == 'd'), 2])
  • 我看到我们不再标记重复项了
  • @Alex 没能很快找到一个好的;如果你有一个好的:投票关闭为重复,我会立即将其标记为重复
  • unstack(df, form = right ~ left) 是经典的从长到宽的骗局。这是最后一个答案
  • @PierreLafortune 你是对的;现在标记为重复

标签: r dataframe


【解决方案1】:

最短的解决方案可能是使用 包中的rowid 函数:

library(data.table)
dt <- dcast(setDT(df), rowid(left) ~ left, value.var = "right")
dt[, names(dt)[1] := NULL]

给出:

> dt
    a  b  c  d
1: 18 52 67 12
2: 36 74 61 86
3: 81 41 82  3

【讨论】:

  • 使用 rowID 时得到错误消息 > dcast(setDT(df), rowid(left) ~ left, value.var = "right") eval(expr, envir, enclos) 中的错误:不能查找函数“rowid”
  • @user3482393 您必须安装development version of data.table 才能访问rowid 功能
【解决方案2】:

坚持使用 dplyr 和 tidyr(感谢它不像其他答案那样整洁!):

df %>% 
mutate(rowId = 1:n()) %>%
group_by(rowId) %>% 
spread(left, right) %>% #gives you wide df with NAs
ungroup() %>% 
select(-rowId) %>% 
mutate(temp = rep(1:3, each = 4)) %>% 
group_by(temp) %>% 
summarise_each(funs(mean(., na.rm = TRUE))) %>% 
ungroup() %>% 
select(-temp)

【讨论】:

  • 这样更好一点:df %&gt;% group_by(left) %&gt;% mutate(b = row_number()) %&gt;% spread(left, right)
  • 这两个都很好用,谢谢。
  • 谢谢@jeremycg,整洁多了。
猜你喜欢
  • 1970-01-01
  • 2013-10-22
  • 2022-07-28
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
相关资源
最近更新 更多