r - 创建具有相同变量的多个子集的新数据框

标签 r dplyr

我想创建一个新的数据框,其中的列是由不同变量拆分的同一变量的子集。例如,我想创建一个新的变量子集 ('b'),其中的列被不同变量 ('year') 的子集分割

set.seed(88)
df <- data.frame(year = rep(1996:1998,3), a = runif(9), b = runif(9), e = runif(9)) 
df

  year          a          b         e
1 1996 0.41050128 0.97679183 0.7477684
2 1997 0.10273570 0.54925568 0.7627982
3 1998 0.74104481 0.74416429 0.2114261
4 1996 0.48007870 0.55296210 0.7377032
5 1997 0.99051343 0.18097104 0.8404930
6 1998 0.99954223 0.02063662 0.9153588
7 1996 0.03247379 0.33055434 0.9182541
8 1997 0.76020784 0.10246882 0.7055694
9 1998 0.67713100 0.59292207 0.4093590

1996 年和 1998 年变量“b”的期望输出为:
         V1         V2
1 0.9767918 0.74416429
2 0.5529621 0.02063662
3 0.3305543 0.59292207

我可能会找到一种用循环来做到这一点的方法,但我想知道是否有 dplyr 方法(或任何简单的方法来实现这一点)。

最佳答案

我们subset数据集基于“年份”中的 1996、1998,select 'year'、'b' 列和 unstack得到预期的输出

unstack(subset(df, year %in% c(1996, 1998), select = c('year', 'b')), b ~ year)
#     X1996      X1998
#1 0.9767918 0.74416429
#2 0.5529621 0.02063662
#@3 0.3305543 0.59292207

或使用 tidyverse , 我们 select感兴趣的列,filter基于'year'列的行,按'year'创建一个序列列,spread到“宽”格式和 select去掉不需要的列
library(tidyverse)
df %>% 
   select(year, b) %>% 
   filter(year %in% c(1996, 1998)) %>%
   group_by(year = factor(year, levels = unique(year), labels = c('V1', 'V2'))) %>% 
   mutate(n = row_number()) %>%
   spread(year, b) %>%
   select(-n)
# A tibble: 3 x 2   
#     V1     V2
#   <dbl>  <dbl>
#1 0.977 0.744 
#2 0.553 0.0206
#3 0.331 0.593 

由于只有两个'year',我们也可以使用summarise
df %>% 
   summarise(V1 = list(b[year == 1996]), V2 = list(b[year == 1998])) %>%
   unnest

关于r - 创建具有相同变量的多个子集的新数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52239017/

相关文章:

r - ggplot2 密度与密度函数有何不同?

r - 如何从 Fortran 调用 R 函数?

r - 为什么不是来自 data.table 列的向量上的 "by"非常慢?

运行函数而不执行其 print() 语句

r - 对数据框的行进行排序

r - 在 R 中排序和保持不同的重复行

r - 根据一组最大值降序排列,然后删除 dplyr 中的最大值列

r - 如何将多个数据框导出到 CSV?

r - 按范围过滤一个数据框的有效方法

r - 如何分组并获取具有 X 最大值的 Y 列的值?