在
base中,您可以使用
split
或
unstack
按
Name拆分
MedName。然后将每个列表元素的
length
设置为相同的长度,并
rbind
它们。
. <- split(x$MedName, x$Name)
do.call(rbind, lapply(., `length<-`, max(lengths(.))))
请注意,结果是一个
矩阵
。如果需要
数据框
,请另外使用
as.data.frame.matrix
。
数据
x <- read.table(header=TRUE, text="
Name MedName
Name1 'atenolol 25mg'
Name1 'aspirin 81mg'
Name1 'sildenafil 100mg'
Name2 'atenolol 50mg'
Name2 'enalapril 20mg'")
基准测试
bench::mark(check=FALSE,
Jaap1 = dcast(setDT(y), Name ~ rowid(Name, prefix = "medication"), value.var = "MedName"),
Jaap2 = x %>% group_by(Name) %>% mutate(rn = paste0("medication",row_number())) %>% spread(rn, MedName),
mnel = {data_with_index <- ddply(x, .(Name), mutate, index = paste0('medication', 1:length(Name)))
dcast(setDT(data_with_index), Name ~ index, value.var = 'MedName') },
thelatemail = reshape(within(x, uniqid <- ave(as.character(Name), Name, FUN = seq_along)), idvar = "Name", timevar = "uniqid", direction = "wide"),
a5c1d2h2i1m1n2o1r2t1 = dcast.data.table(getanID(y, "Name"), Name ~ .id, value.var = "MedName"),
"Anthony Damico" = {. <- x[order(x[, "Name"]),]
.$time <- unlist( lapply( rle( as.character( .[ , "Name" ] ) )$lengths , seq_len ) )
reshape( . , idvar = "Name" , direction = 'wide' ) },
"Ric S" = x %>% group_by(Name) %>% mutate(row_n = row_number()) %>%
pivot_wider(id_cols = Name, names_from = row_n, values_from = MedName, names_glue = "medication{row_n}"),
"Darren Tsai" = x %>% chop(-Name) %>% unnest_wider(MedName, names_sep = ""),
moodymudskipper = x %>% group_by(Name) %>% do(as_tibble(t(unlist(.[2])))),
GKi = {. <- split(x$MedName, x$Name)
do.call(rbind, lapply(., "[", 1:max(lengths(.)))) },
GKi2 = {. <- split(x$MedName, x$Name)
do.call(rbind, lapply(., `length<-`, max(lengths(.))))}
)
结果
expression min median `itr/sec` mem_al…¹ gc/se…² n_itr n_gc
<bch:expr> <bch:tm> <bch:tm> <dbl> <bch:by> <dbl> <int> <dbl>
1 Jaap1 910.83µs 1.5ms 645. 274.5KB 8.32 310 4
2 Jaap2 9.64ms 11.53ms 86.9 16.5KB 9.15 38 4
3 mnel 4.69ms 5.91ms 164. 280.1KB 6.31 78 3
4 thelatemail 619.74µs 898.36µs 959. 0B 12.6 458 6
5 a5c1d2h2i1m1n2o1r2t1 1.36ms 2.18ms 426. 291.4KB 8.70 196 4
6 Anthony Damico 565.34µs 794.76µs 1123. 0B 12.5 537 6
7 Ric S 13.51ms 15.59ms 62.4 64.2KB 6.69 28 3
8 Darren Tsai 3.75ms 5.02ms 199. 22.7KB 8.54 93 4
9 moodymudskipper 12.88ms 15.88ms 63.5 26.5KB 6.81 28 3
10 GKi 31.58µs 35.73µs 21448. 0B 17.2 9992 8
11 GKi2 29.41µs 32.77µs 23717. 0B 16.6 9993 7
在这种情况下,GKi大约比第二个快15倍,并且属于不分配额外内存的组。
medication1,medication10,medication11,medication12,...,medication2
的顺序排列。如何解决排序问题? - Cina