【问题标题】:Combining datasets using dplyr使用 dplyr 组合数据集
【发布时间】:2021-10-21 21:10:48
【问题描述】:

我有一个 1000*4 的数据集,其中包含以下变量:

Cohabiting at year-9? (C9)
Cohabiting at year-15? (C15)
Married at year-9? (M9)
Married at year-15? (M15)

感谢您提供详细的解决方案。什么是“NA_character”?我的数据集中也有 NA。如果除了上述之外,我还想为具有 (C9 = 1 和 M15 = 0) 和 (C9 = 0 和 M15 = 1) 的值添加另一个值 (4) 怎么办?

每一个都有一个值 1(表示是)、0(表示否)和 NA 表示不响应。我想创建一个具有以下条件的新列:

`如果 M9 = M15 = 1,则将值命名为“已婚”并将其分配为“1” 如果 C9 = C15 = 1,则将值命名为“同居”并将其分配为“2” 如果 C9 = C15 = M9 = M15 = 0,则将值命名为“非完整”并将其赋值为 3 如果 (C9 = 1 和 M15 = 0) 和 (C9 = 0 和 M15 = 1),则将值命名为“删除”并将其赋值为 4 如果其中一列包含NA,则将其保留为“NA”'

所以基本上,我想用上述值创建一个新列。

【问题讨论】:

  • 听起来你想创建 3 个新列而不是一个。无论如何,这可以通过 mutate() 函数来完成
  • 感谢您指出这一点。我编辑了我的问题。
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example

标签: r dplyr multiple-columns


【解决方案1】:

我们可能会使用if_all/if_any

library(dplyr)
df1 %>% 
  mutate(result = case_when(if_any(c(M9, M15, C9, C15), is.na) ~ 
        NA_character_,  
     if_all(c(M9, M15), `==`, 1) ~ 'Married', 
     if_all(c(C9, C15), `==`, 1) ~ 'Cohabiting', 
     if_all(c(M9, M15, C9, C15), `==`, 0) ~ 'Non-intact'),
     new =match(result, c("Married", "Cohabiting", "Non-intact")))

-输出

# A tibble: 6 × 6
     C9   C15    M9   M15 result       new
  <dbl> <dbl> <dbl> <dbl> <chr>      <int>
1     1     1     0     1 Cohabiting     2
2     0    NA     1     0 <NA>          NA
3     1     1     0     1 Cohabiting     2
4     1     1     0     1 Cohabiting     2
5     0     1     1     1 Married        1
6     0     0     0     0 Non-intact     3

数据

df1 <- structure(list(C9 = c(1, 0, 1, 1, 0, 0), C15 = c(1, NA, 1, 1, 
1, 0), M9 = c(0, 1, 0, 0, 1, 0), M15 = c(1, 0, 1, 1, 1, 0)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

【讨论】:

  • 感谢您的详细解决方案。什么是“NA_character”?我的数据集中也有 NA。如果除了上述之外,我还想为那些具有 (C9 = 1 和 M15 = 0) 和 (C9 = 0 和 M15 = 1) 的值添加另一个值 (4) 怎么办?提前致谢!
【解决方案2】:

您可以使用case_when 将所有条件映射到单个列中的值。像这样的:

data %>% 
  mutate(result = case_when( M9 == 1 & M15 == 1 ~ "Married",
                             C9 == 1 & C15 == 1 ~ "Cohabiting",
                             M9+M15+C9+C15 == 0 ~ "Non-intact"
  ))

【讨论】:

  • 谢谢。但是,如果我也想为它们分配数值怎么办。比如1表示已婚,2表示同居等等?
猜你喜欢
  • 2021-04-19
  • 2021-08-10
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多