【问题标题】:create a new column based on filter_at in R在 R 中基于 filter_at 创建一个新列
【发布时间】:2021-03-25 16:25:37
【问题描述】:

我需要根据一组现有的 ICD 列创建一个新的是/否(或 1/0)变量,以具有满足要求的特定值为准。 我目前的代码是: 包含 %>% filter_at(vars("col1", "col2", "col3"), any_vars(. %in% c(49100, 49122, 48911, 404)))。但是,这不会帮助我生成最终的 yes/no 变量。有什么建议吗?

【问题讨论】:

  • 你应该使用dplyr函数dplyr::mutate()。使用此功能,您可以在数据集中添加/修改列。你不能用 dplyr::filter_at() 做到这一点。
  • 喜静。你可以添加一个reprex吗?这会增加获得具体答案的机会吗? (见:stackoverflow.com/questions/5963269/…

标签: r


【解决方案1】:

您可以考虑使用mutate(across(...))ifelse,而不是使用filter_at

inclusion %>%
   mutate(across(c(col1, col2, col3),
   ~ifelse(.x %in% c(49100, 49122, 48911, 404), TRUE, FALSE)))

这将覆盖这些列。如果您想要新列,请添加 .names 参数,如下所示:

inclusion %>%
   mutate(across(c(col1, col2, col3),
   ~ifelse(.x %in% c(49100, 49122, 48911, 404), TRUE, FALSE),
   .names = "{col}_in_vec"))

如果您想对任何值是否包含在三列中的任何一列中都有一个输出,请使用c_across

inclusion %>%
   rowwise() %>%
   mutate(in_vec = any(c_across(c(col1, col2, col3)) %in% c(49100, 49122, 48911, 404)))

【讨论】:

  • 它应该保留所有观察结果,如果您愿意,可以将TRUE FALSE 换成10,但mutate 不会放弃观察结果。
  • 保留所有 obs;但是我怎样才能找到创建的新变量?例如,如果三列中的任何一列的值为 49100,则需要一个值为 =1 的新变量。
  • 您需要确保 (1) 使用 <- 将输出分配给对象,并且 (2) 在 across 中使用 .names 参数(如第二个示例所示)创建具有所需输出的新列。
  • 我想我现在明白你的问题了。检查第三个解决方案,让我知道它是否有效。
  • 我尝试了精确代码"包含 %>% rowwise() %>% mutate(in_vec = any(c_across(c(col1, col2, col3)) %in% c(49100, 49122, 48911 , 404)))”,这是错误消息:错误:c_across() 只能在 dplyr 动词中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2021-07-06
  • 2021-11-05
  • 2014-04-28
  • 1970-01-01
相关资源
最近更新 更多