城市 | 年龄 | 姓名 | 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", “帕金森”,北美))
但意识到我只是在添加多列。我试图向现有数据集添加一个额外的列,如下表所示,它的值是“阿尔茨海默病”、“痴呆症”、“帕金森病”或“其他”。
诊断 |
---|
老年痴呆症 |
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
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、列表等。
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'
)
)