传播到R中的一列

时间:2016-05-06 20:05:44

标签: r tidyr

所以说我有这样的数据框:

data.frame(x = c(1,1,1,3,3,3),y = c(12,32,43,16,32,65))

我希望将其转换为如下数据框:

data.frame(x = c(1, 3), y_1 =  c(12,16), y_2 =c(32, 32),y_3= c(43, 65))

基本上扩展每个唯一x值的y值。我试图用tidyr做到这一点,但不能完全看出它是如何工作的。有什么想法吗?

感谢。

4 个答案:

答案 0 :(得分:3)

这是一个$('.col-sm-3').each(function (index, elem) { if($(elem).text().length === 0) { $(elem).html(' '); } }); 解决方案:

data.table

即使所有library(data.table) dat = as.data.table(df) # or setDT to convert in place dat[, obs := paste0('y_', 1:.N), by=x] dcast(dat, x ~ obs, value.var="y") # x y_1 y_2 y_3 #1: 1 12 32 43 #2: 3 16 32 65 的行数不相同,这也会有效。

答案 1 :(得分:3)

我们可以使用body,html{ height:100%; } ,然后使用aggregate cSplit来强制使用数据框,

splitstackshape

答案 2 :(得分:1)

Sotos使用aggregate给出的答案特别优雅,但使用reshape的以下方法也可能具有指导意义:

df <- data.frame(x = c(1,1,1,3,3,3),y = c(12,32,43,16,32,65))
df[,"time"] <- rep(1:3, 2)
wide_df <- reshape(df, direction="wide", timevar="time", idvar="x")

答案 3 :(得分:1)

dplyr/tidyr

的一个选项
library(dplyr)
library(tidyr)
df1 %>% 
    group_by(x) %>% 
    mutate(n = paste("y", row_number(), sep="_")) %>%
    spread(n,y)
#     x   y_1   y_2   y_3
#   (dbl) (dbl) (dbl) (dbl)
#1     1    12    32    43
#2     3    16    32    65