重新排序具有重复 ID 的数据框

标签 r dataframe dplyr tidyr

我有一个名为 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/

相关文章:

python - 对多索引 Pandas 数据框中的行求和

r - 如何使用 case_when 在 dplyr 中应用不同的函数

r - 是否有一个函数与 close() 的关系相当于 %in% 与 == 的关系?

r - 在 dplyr 链中转换 Excel 日期格式

R - 有有效的方法来执行这项重复性任务吗?

r - 在 R 中,检查属性是否在数据框整列的列表中

r - 在 r 中为组的平均值创建折线图

r - 在捕食者猎物系统的生态建模中正确使用 deSolve

python - 使用另一个列表从数据帧列表添加数据帧

python - 将包含字符串和整数值的元组中的值组合起来并存储为数据帧