【问题标题】:Collapsing Rows in Longitudinal Dataset纵向数据集中的折叠行
【发布时间】:2019-04-24 21:48:11
【问题描述】:

我有一个数据集,其中有多行都对应于基线度量。我想按记录 id 折叠这些行,以便每个人只有一行用于基线测量。这意味着我必须折叠所有变量,其中一些是字符变量。我该怎么做呢?这是我尝试过的:

df.test %>% group_by(id) %>% filter(time == 0) %>% 
    summarise_all(., collapse=", ")

我正在使用的示例数据框如下所示:

data.frame(id = rep(99, 5), time = c(rep(0, 3), 3, 6), v1 = c("blk", NA, NA, 2, 3), v2 = c(NA, 1, NA, 4, 5), v3 = c(NA, NA, 1, 6, 7))

我需要它看起来像这样:

data.frame(id = rep(99, 3), time = c(rep(0, 1), 3, 6), v1 = c("blk", 2, 3), v2 = c(1, 4, 5), v3 = c(1, 6, 7))

我不知道 summarise 是否适合在这里使用。基本上我遇到的一个问题是字符的总和,我认为这就是为什么汇总不起作用。理想情况下,我真正想要做的就是将时间 = 0 的所有行中的信息按 id 组合起来,这样每个唯一 id 都有一行时间 = 0。

(对不起,我不确定如何让 data.frame 命令打印数据框?)

请帮忙!

编辑:示例 2

data.frame(id = c(rep(99,5), 100, 101, 101), time = c(rep(0, 3), 3, 6, 0, 0, 0), character = c(NA, NA, "blk", rep(NA, 5)), binary = c(1, rep(NA, 5), 0, NA), continuous = c(NA, NA, 2.29, rep(NA, 5)))

这与我的数据看起来很接近。我可以说的不起作用如下:

1)字符变量丢失 2)二进制变量中的 0 丢失(即使使用 != is.na(.) 而不是 != 0 2a)这是原子的,我将其更改为因子,现在它似乎可以工作 3) 连续变量 2.29 丢失 4) 有趣的是这里没有显示的是整数值,不是 0 的值似乎被保留,但整数都消失了——这是因为如果结构是原子的,整数就无法读取?

结论:我认为我需要从 atomic 更改所有值(它们是从 SPSS 以这种方式带入 r 的)?在此期间我会试试这个。

edit2:问题不在于数字与原子。我把所有东西都变成了数字,但整数仍然没有显示出来。

【问题讨论】:

  • 如果您提供数据样本和所需的输出会有所帮助。目前尚不清楚您从哪个包中获取collapse,以及您在此处拥有哪些不同的列类型
  • @CalumYou 好主意。我用示例数据编辑了我的问题。就我使用的折叠功能而言,我相信它是 dplyr 中的折叠功能。

标签: r dplyr tidyverse tidyr longitudinal


【解决方案1】:

dplyr::collapse 不希望您希望它这样做,请阅读?dplyr::collapse。您需要传递summarise_all 一个函数,该函数从每个组中挑选出您想要保留的值。我在这里推断您想要摆脱所有 0 值。虽然在这里没关系,但如果有多个非零值,我也会使用first 来获取每列中每个组中的第一个值以防止错误。您应该检查您的数据以确保它具有此布局。

library(dplyr)
tbl <- data.frame(id = rep(99, 5), time = c(rep(0, 3), 3, 6), v1 = c("blk", 0, 0, 2, 3), v2 = c(0, 1, 0, 4, 5), v3 = c(0, 0, 1, 6, 7))
tbl %>%
  group_by(id, time) %>%
  summarise_all(~ .[. != 0] %>% first())
#> # A tibble: 3 x 5
#> # Groups:   id [1]
#>      id  time v1       v2    v3
#>   <dbl> <dbl> <fct> <dbl> <dbl>
#> 1    99     0 blk       1     1
#> 2    99     3 2         4     6
#> 3    99     6 3         5     7

reprex package (v0.2.1) 于 2019 年 4 月 24 日创建

【讨论】:

  • 这更接近我的需要,但它未能保留某些值,我不知道为什么。其中一些值为 0,我尝试用 is.NA(.) 替换 0,但仍然没有维护 0。
  • 尝试找出不起作用的行并将它们包含在您的示例中
  • 是的,它看起来不像是折叠行,而是占据第一行并消除所有其他行。
  • 您仍然没有说出折叠行的逻辑是什么。我决定去掉零并取剩下的第一个,因为它可以重现你的输出。但是,如果您有一些逻辑可以说明每列的每组行要保留什么,则需要编写它,否则我们不知道您想要什么。
【解决方案2】:

这个怎么样?

temp % group_by(id) %>% filter(time==0) %>% summarise_all(funs(paste0(.,collapse = "_")))

希望这就是你要找的。​​p>

【讨论】:

  • 这并不能完全解决问题,但它可以帮助我更接近。这本质上就是我想要的。这给了我一堆串在一起的 NA 和实际数据,我理解它自然应该这样做。但是现在一切都是一个字符,我确信有一种系统的方法可以从每个单元格/案例中删除所有 NA 实例?将通过管道传输什么命令来对所有数据执行此操作?编辑:也谢谢你。这真的让我很好地理解了 paste 的作用。
猜你喜欢
  • 2013-12-13
  • 2022-11-19
  • 2016-04-24
  • 2017-09-16
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多