将数据集与已知的身份变量相结合

时间:2015-08-20 12:36:40

标签: r merge

所以我们采取以下数据

set.seed(123)

A <- 1:10
age<- sample(20:50,10)
height <- sample(100:210,10)

df1 <- data.frame(A, age, height)


B <- c(1,1,1,2,2,3,3,5,5,5,5,8,8,9,10,10)
injury <- sample(letters[1:5],16, replace=T)

df2 <- data.frame(B, injury)

现在,我们可以使用以下代码merge数据:

df3 <- merge(df1, df2, by.x = "A", by.y = "B", all=T)

head(df3)
#   A age height injury
# 1 1  28    206      e
# 2 1  28    206      d
# 3 1  28    206      d
# 4 2  43    149      e
# 5 2  43    149      d
# 6 3  31    173      d

但我在新数据框中想要的是injury作为level变量的长度。

所以期望的输出应该如下所示:

enter image description here

因此,在这个简单的示例中,我们知道injury的最大长度为每个唯一df2$B 4。所以我们需要4个新列。

我的数据必须具有未知数字,因此需要使用代码来生成正确的数据,例如

length(unique(df2$injury[df2$B]))

但这也不是正确的语法,因为输出应该等于4

2 个答案:

答案 0 :(得分:2)

我不知道您的示例输出中的字母来自哪里,因为示例输入中的变量中没有,但您可以尝试以下内容:

library(splitstackshape)
dcast.data.table(getanID(df3, c("A", "age")), A + age + height ~ 
    .id, value.var = "injury")
##      A age height  1  2  3  4
##  1:  1  28    206  4  3  3 NA
##  2:  2  43    149  4  3 NA NA
##  3:  3  31    173  3  3 NA NA
##  4:  4  44    161 NA NA NA NA
##  5:  5  45    111  3  2  1  4
##  6:  6  21    195 NA NA NA NA
##  7:  7  33    125 NA NA NA NA
##  8:  8  41    104  4  3 NA NA
##  9:  9  32    133  4 NA NA NA
## 10: 10  30    197  1  2 NA NA

这会根据前两列添加辅助ID,然后将其扩展为宽格式。

答案 1 :(得分:1)

如果您想使用tidyr包完成此操作,我发现有必要创建一个索引变量:

df3 %>%
  group_by(A) %>%
  mutate(ind = row_number()) %>%
  spread(ind, injury)