原始数据框中有3列:id,type和rank。现在我想创建一个新的数据框,将每个可能的类型值作为单个列(请参阅下面的小示例,原始数据包含> 100.000行和30种类型)
data1
id type rank
x a 1
y a 2
z a 3
x b 1
z b 2
y c 1
data2
id a b c
x 1 1 NA
y 2 NA 1
z 3 2 NA
这就是我到目前为止所做的:
for (i in (1:nrow(data1))) {
dtype <- data[i,2]
if (any(data2$id == data1[i,1], na.rm = TRUE)) {
row <- grep(data1[i,1],data2$id)
data2[row,c(dtype)] <- data1[i,3]
} else {
data2[nrow(data2)+1,1] <- as.character(data1[i,1])
data2[nrow(data2),c(dtype)] <- data1[i,3]
}
}
这有效(我希望这个例子解释我在做什么),但它很慢。您是否有任何提示我如何优化此算法?
答案 0 :(得分:4)
使用问题中提到的单词功能,您只需使用基础R中的reshape
:
> reshape(mydf, direction = "wide", idvar = "id", timevar = "type")
id rank.a rank.b rank.c
1 x 1 1 NA
2 y 2 NA 1
3 z 3 2 NA
答案 1 :(得分:3)
以下是tidyr
包中的示例。
library("tidyr")
library("dplyr")
data2<-
data1 %>% spread(type, rank)
id a b c
1 x 1 1 NA
2 y 2 NA 1
3 z 3 2 NA
答案 2 :(得分:3)
此处使用data.table
:
require(data.table)
ans = dcast.data.table(setDT(data1), id ~ type)
ans
# id a b c
# 1: x 1 1 NA
# 2: y 2 NA 1
# 3: z 3 2 NA