我有一个名为 df 的小标题,格式为:
sample nuclide intensity
SRM1 Pb206 200
SRM1 Pb207 250
SRM1 Pb208 301
SRM1 Pb206 202
SRM1 Pb207 254
SRM1 Pb208 305
SAM1 Pb206 154
SAM1 Pb207 262
SAM1 Pb208 311
SAM1 Pb206 157
SAM1 Pb207 261
SAM1 Pb208 325
它可以通过以下方式生成:
df <- tbl_df(
data.frame(sample = rep(c("SRM1", "SAM1"), each = 6),
nuclide = rep(c("Pb206", "Pb207", "Pb208"), 4),
intensity = c(200, 250, 301, 202, 254, 305, 154, 262, 311, 157, 261, 325)))
我想重新安排它
sample Pb208 Pb207 Pb206
SRM1 301 250 200
SRM1 305 254 202
SAM1 311 262 157
SAM1 325 261 204
我尝试使用 tidyr 包:
df %>%
select(sample, nuclide, intensity) %>%
group_by(sample) %>%
mutate(row = 1:n()) %>%
spread(nuclide, intensity) %>% select(-row)
但它产生了不同的结果,其中包含许多不需要的 NA。
非常重要的是,在转换过程中,数据集中样本的名称应保留其原始顺序,并且不使用聚合函数。特别是第一个条件,它使我的问题与之前发布的其他类似问题有所不同。
然后,该解决方案将应用于包含超过 20000 行的更大的数据集。
最佳答案
使用:
lvls <- as.character(unique(df$sample))
library(tidyverse) # this will load 'dplyr' and 'tidyr' among others
df %>%
group_by(sample, nuclide) %>%
mutate(id = row_number()) %>%
spread(nuclide, intensity) %>%
ungroup() %>% # needed to be able to modify the 'sample' variable
mutate(sample = factor(sample, levels = lvls)) %>%
arrange(sample) %>%
select(sample, Pb208:Pb206)
给出:
sample Pb208 Pb207 Pb206
(fctr) (dbl) (dbl) (dbl)
1 SRM1 301 250 200
2 SRM1 305 254 202
3 SAM1 311 262 154
4 SAM1 325 261 157
或者(如果您只想要降序):
df %>%
group_by(sample, nuclide) %>%
mutate(id = row_number()) %>%
spread(nuclide, intensity) %>%
arrange(desc(sample)) %>%
select(sample, Pb208:Pb206)
使用 data.table
的替代方法:
library(data.table)
dcast(setDT(df), sample + rowid(sample, nuclide) ~ nuclide,
value.var = 'intensity')[, sample := factor(sample, levels = lvls)
][order(sample)]
关于重新排序具有重复 ID 的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42390547/