我如何根据条件/值将多列组合成 r 中的一个新列

问题描述 投票:0回答:3
城市 年龄 姓名 Q11_1 Q11_4 Q11_5 Q11_6 Q11_7
.... .... ... 是的
... ... ... 是的
... ... ... 是的
... ... ... 是的
... .. ... 是的
... ... ...
.. ... ...

我有一个类似于此表的数据集,其中询问人们是否患有任何特定疾病(Q11 列),他们只能对一列选择“是”。但是每种疾病都分为多个列,我想创建一个名为 Diagnosis 的新列,它列出了他们所患的疾病,而不是“是”或“否”值。我希望这个新列有四个值:如果 Q11_1== yes,则该值为“Alzheimer”。如果 Q11_4== yes,则值为“Dementia”。 Q11_5== yes,则值为“Parkinson”,如果Q11_6或Q11_7== yes,则值为“other”

我尝试将此代码与 tidyverse 库一起使用 ifelse 语句:

df %>% mutate(diagnosis= ifelse(Q11_1== "Yes", "Alzheimer", NA), ifelse(Q11_4 == "Yes", "痴呆", NA), ifelse(Q11_5 == "Yes", “帕金森”,北美))

但意识到我只是在添加多列。我试图向现有数据集添加一个额外的列,如下表所示,它的值是“阿尔茨海默病”、“痴呆症”、“帕金森病”或“其他”。

失智 帕金森其他
诊断
老年痴呆症

enter image description here

r tidyverse multiple-columns
3个回答
3
投票

library(tidyverse) data <- read.table(text="City Age Name QAlzheimer QDementia QParkinson QFTD QLewy .... .... ... yes no no no no ... ... ... no yes no no no ... ... ... no no yes no no ... ... ... no no no yes no ... .. ... no no no no yes ... ... ... no no no no no .. ... ... no no no no no ", header=TRUE) data %>% pivot_longer(matches("^Q"),names_to="Diagnosis",names_prefix="Q") %>% filter(value == "yes") %>% select(-value)

数据则变为:

City Age Name Diagnosis <chr> <chr> <chr> <chr> 1 .... .... ... Alzheimer 2 ... ... ... Dementia 3 ... ... ... Parkinson 4 ... ... ... FTD 5 ... .. ... Lewy



0
投票
yes

,在基数 R 中你可以这样做:

df$diagnosis <- "other"
idx <- which(df=='yes', TRUE)
df$diagnosis[idx[,1]] <- names(df)[idx[,2]]

  City  Age Name QAlzheimer QDementia PQarkinson QFTD QLewy  diagnosis
1 .... ....  ...        yes        no         no   no    no QAlzheimer
2  ...  ...  ...         no       yes         no   no    no  QDementia
3  ...  ...  ...         no        no        yes   no    no PQarkinson
4  ...  ...  ...         no        no         no  yes    no       QFTD
5  ...   ..  ...         no        no         no   no   yes      QLewy
6  ...  ...  ...         no        no         no   no    no      other
7   ..  ...  ...         no        no         no   no    no      other

如果每行有多个
yes

,在分配给该行之前,您必须将它们聚合在一起,例如粘贴、tostring、列表等。

    


0
投票
ifelse

,这是您可能更喜欢

case_when
的情况。请注意,与
case...when
的其他实现一样,数据集的每一行都将被分配对应于第一个评估为真的条件的值。
data %>% 
  mutate(
    Diagnosis = case_when(
      Q11_1 == 'yes' ~ 'Alzheimer',
      Q11_4 == 'yes' ~ 'Dementia',
      Q11_5 == 'yes' ~ 'Parkinson',
      Q11_7 == 'yes' ~ 'Other'
    )
  )

© www.soinside.com 2019 - 2024. All rights reserved.