如何在r中基于条件/值将多个列合并为一个新列

nwlls2ji  于 2023-04-27  发布在  其他
关注(0)|答案(3)|浏览(111)
城市年龄姓名Q11_1Q11_4Q11_5Q11_6Q11_7
………………是的
………………
………………
………………
……...……
………………
...…………

我有一个数据集,看起来像这样的表,人们被问到他们是否有任何特定的疾病(Q11列),他们只能选择一列是。但是每种疾病被分成多列,我想创建一个名为Diagnosis的新列,列出他们所患的疾病,而不是yes或no值。我希望这个新列有四个值:其中,如果Q11_1==是,则值为“阿尔茨海默病”。如果Q11_4==是,则值为“痴呆”。Q11_5==是,则值为“帕金森”,并且如果Q11_6或Q11_7==是,则值为“其他”。
我试着在tidyverse库中使用ifelse语句:
df %〉%突变(诊断= ifelse(Q11_1==“是”,“阿尔茨海默病”,NA),ifelse(Q11_4 ==“是”,“痴呆”,NA),ifelse(Q11_5 ==“是”,“帕金森病”,NA))
但我意识到我只是添加了多个列。我试图只添加一个额外的列到现有的数据集,看起来像下面的表,它的值要么是“阿尔茨海默氏症”,“痴呆症”,“帕金森”,或“其他”。
| 诊断|
| --------------|
| 阿尔兹海默|
| 痴呆|
| 帕金森|
| 其他|
enter image description here

js81xvg6

js81xvg61#

这是pivot_longer的一个典型例子:

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
xu3bshqb

xu3bshqb2#

如果ATMOST每行有一个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,列表等。

jjjwad0x

jjjwad0x3#

ifelse相比,在这种情况下,您可能更喜欢case_when。请注意,与case...when的其他实现一样,数据集的每一行都将被分配与第一个评估为true的条件相对应的值。

data %>% 
  mutate(
    Diagnosis = case_when(
      Q11_1 == 'yes' ~ 'Alzheimer',
      Q11_4 == 'yes' ~ 'Dementia',
      Q11_5 == 'yes' ~ 'Parkinson',
      Q11_7 == 'yes' ~ 'Other'
    )
  )

相关问题