所以我们采取以下数据
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
变量的长度。
所以期望的输出应该如下所示:
因此,在这个简单的示例中,我们知道injury
的最大长度为每个唯一df2$B
4。所以我们需要4个新列。
我的数据必须具有未知数字,因此需要使用代码来生成正确的数据,例如
length(unique(df2$injury[df2$B]))
但这也不是正确的语法,因为输出应该等于4
答案 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)