【问题标题】:How do I combine multiple rows into one using R?如何使用 R 将多行合并为一行?
【发布时间】:2020-06-24 12:51:58
【问题描述】:

我有一个包含患者数据的大型数据集。有些患者有多行,我想将这些行合并,以便每个患者都有一行。

我有大约 20 个不同的变量。组合行时,某些变量需要保持不变(例如,在第 1 组中有 4 行的患者,在组合行时仍应在第 1 组),但我也有必须满足特定条件的变量(例如,如果患者在其中一行(或多行)进行了手术,则应为“是”。如果没有,则应为“否”)。

我已经尝试寻找答案,但我很困惑。我尝试使用 plyr,但似乎不建议使用此功能,因为数据集非常大时它会变得很慢。我找到了一些关于 dplyr 的信息,但我不明白我应该如何使用它。

例如,我有以下数据集(我很抱歉我如何呈现这个,我是 Stackoverflow 的新手)

**Patient_Id** /**Group** /**Age** /**Gender** /**surgery y/n** /**no of surgeries** 

1 - 1 - 63 - F - no - 0      

1 - 1 - 63 - F - no - 0

1 - 1 - 64 - F - yes - 1

2 - 0 - 60 - M - yes - 2

3 - 1 - 65 - M - no - 0

4 - 0 - 60 - F - no - 0

4 - 0 - 61 - F - yes - 1

4 - 0 - 62 - F - yes - 1

我想制作一个这样的数据框

**Patient_Id** /**Group** /**Age** /**Gender** /**surgery y/n** /**no of surgeries** 

1 - 1 - 63,33 - F - yes - 1 

2 - 0 - 60 - M - yes - 2

3 - 1 - 65 - M - no - 0

4 - 0 - 61 - F - yes - 2

有谁知道最好使用什么功能?或者如何开始? 先感谢您!

dput 格式的数据。

df1 <-
structure(list(Patient_Id = c(1, 1, 1, 2, 3, 4, 4, 4), 
Group = c(1, 1, 1, 0, 1, 0, 0, 0), Age = c(63, 63, 64, 
60, 65, 60, 61, 62), Gender = c("F", "F", "F", "M", 
"M", "F", "F", "F"), `surgery y/n` = c("no", "no", "yes", 
"yes", "no", "no", "yes", "yes"), `no of surgeries` = c(0L, 
0L, 1L, 2L, 0L, 0L, 1L, 1L)), row.names = c(NA, -8L), 
class = "data.frame")


df2 <-
structure(list(Patient_Id = c(1, 2, 3, 4), 
Group = c(1, 0, 1, 0), Age = c("63,33", 
"60", "65", "61"), Gender = c("F", "M", 
"M", "F"), `surgery y/n` = c("yes", "yes", 
"no", "yes"), `no of surgeries` = c(1, 2, 
0, 2)), row.names = c(NA, -4L), 
class = "data.frame")

我的数据框结构如下:

str(SMARTdata_50j_diagc_2016) 'data.frame':458794 obs。 20 个变量:

$ Groep : 因子 w/ 2 个级别 "0","1": 2 2 2 2 2 1 2 2 2 2 ...

$ Ziekenhuis_Nr : 13 个等级的因子 "1","10","11",..: 2 8 4 11 3 7 10 9 13 6 ...

$ Ziekenhuistype : 因子 w/ 3 个水平 "0","1","2": 2 2 2 2 1 1 2 1 2 3 ...

$ Patient_Id:数字 85550 101414 239946 291650 140558 ...

$ DBC_Id : 数字 181394 230887 448945 524873 251352 ...

$ Diagnose_Code : 因子 w/ 5 个级别 "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1 ...

$ Zorgtype_Code : 因子 w/ 2 个级别 "0","1": 2 2 2 1 2 2 2 1 1 2 ...

$ Lft_patient_openenDBC : num 50 80 66 60 67 64 54 71 70 76 ...

$ Geslacht : 因子 w/ 2 个级别 "0","1": 1 1 2 2 2 1 1 1 2 1 ...

$ MRI_nee_ja : 因子 w/ 2 个级别 "0","1": 1 1 1 2 1 1 1 1 1 1 ...

$ MRI_Aantal : 数量 0 0 0 1 0 0 0 0 0 0 ...

$ Artroscopie_nee_jaz_jam : 因子 w/ 3 个级别 "0","1","2": 1 1 1 3 1 1 1 1 1 1 ...

$ Artroscopie_aantal : num 0 0 0 1 0 0 0 0 0 0 ...

$ Jaar_openen_DBC : 数量 2016 2017 2018 2017 2017 ...

$ Mnd_openen_DBC : 数字 12 5 6 2 5 8 10 11 1 1 ...

$ Jaar_sluiten_DBC : num 2017 2017 2018 2017 2017 ...

$ Mnd_sluiten_DBC : num 4 9 10 4 9 12 2 3 4 5 ...

$ Aantal_overigeDBC_bijopenen: num 1 1 2 1 0 0 1 0 0 0 ...

$ open_DBC : 'yearmon' num Dec 2016 May 2017 Jun 2018 Feb 2017 ...

$ sluiten_DBC : 'yearmon' num Apr 2017 Sep 2017 Oct 2018 Apr 2017 ...

【问题讨论】:

  • 欢迎来到 StackOverflow!请阅读有关how to ask a good question 的信息以及如何提供reproducible example。这将使其他人更容易帮助您。
  • 为了更好地理解问题,请做一个可重现的例子。
  • @Diego,我很抱歉!我希望我的编辑能让它更清楚,谢谢。

标签: r


【解决方案1】:

您的问题直截了当。通过dplyr 包实现的一种方法是,

library(dplyr)

df1 %>% 
 group_by(Patient_Id) %>% 
 summarise(Group = first(Group), 
           Age = mean(Age), 
           Gender = first(Gender), 
           `no of surgeries` = sum(`no of surgeries`), 
          `surgery y/n` = ifelse(`no of surgeries` == 0, 'no', 'yes'))

给出,

# A tibble: 4 x 6
  Patient_Id Group   Age Gender `no of surgeries` `surgery y/n`
       <dbl> <dbl> <dbl> <chr>              <int> <chr>        
1          1     1  63.3 F                      1 yes          
2          2     0  60   M                      2 yes          
3          3     1  65   M                      0 no           
4          4     0  61   F                      2 yes 

【讨论】:

  • 感谢您的回答!我已经尝试过您的建议(之前也是如此),但问题是我得到了一个只有一次观察的数据框!我尝试完全按照您在我的数据集上编写的内容运行,但出现以下错误:Error in quicker(.data[names(cols)]): length(rows) == 1 is not TRUE.
  • 你能分享一下你的数据框的结构吗?做str(your_data_frame)并将其发布在您的问题中
  • 我已经添加了数据框的结构。我认为这是一个“正常”数据框,我看不出它有什么问题!
  • 感谢您的回答!我想通了!
猜你喜欢
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多