R 基于单独列中的字符串匹配,有条件地替换多列中的值

R 基于单独列中的字符串匹配,有条件地替换多列中的值,r,dplyr,stringr,mutate,across,R,Dplyr,Stringr,Mutate,Across,我试图根据不同列中的字符串匹配情况,有条件地替换多列中的值,但我希望能够使用Cross()函数在一行代码中执行此操作,但我不断遇到对我来说意义不大的错误。我觉得这可能是一个简单的解决方案,所以如果有人能给我指出正确的方向,那就太棒了 df <- data.frame("type" = c("Park", "Neighborhood", "Airport", "Park", "Nei

我试图根据不同列中的字符串匹配情况,有条件地替换多列中的值,但我希望能够使用Cross()函数在一行代码中执行此操作,但我不断遇到对我来说意义不大的错误。我觉得这可能是一个简单的解决方案,所以如果有人能给我指出正确的方向,那就太棒了

df <- data.frame("type" = c("Park", "Neighborhood", "Airport", "Park", "Neighborhood", "Neighborhood"),
               "total" = c(34, 56, 75, 89, 21, 56),
               "group_a" = c(30, 26, 45, 60, 3, 46),
               "group_b" = c(4, 30, 30, 29, 18, 10))

# working but not concise
df %>%
  mutate(total = ifelse(str_detect(type, "Park"), NA, total),
         group_a = ifelse(str_detect(type, "Park"), NA, group_a),
         group_b = ifelse(str_detect(type, "Park"), NA, group_b))

  
# concise but not working
df %>% mutate(across(total, group_a, group_b), ifelse(str_detect(type, "Park"), NA, .))
最后更新
错误放置的结束括号的诅咒!谢谢大家的帮助。。。正确的解决方案是
df%>%mutate(跨越(c(尝试、游说、完成)、~ifelse(str_detect(long_name,“park chemelture”)、NA等)
如果您使用新引入的函数
跨越
(这是完成此任务的正确方法),您必须在
内部跨
本身指定要应用的函数。在这种情况下,函数
ifelse(…)
必须是一个purr样式的lambda(因此从
~
开始)。查看
中的
并查找参数
.cols
.fns

df %>% 
  mutate(across(c(total, group_a, group_b), ~ifelse(str_detect(type, "Park"), NA, .)))
输出

#           type total group_a group_b
# 1         Park    NA      NA      NA
# 2 Neighborhood    56      26      30
# 3      Airport    75      45      30
# 4         Park    NA      NA      NA
# 5 Neighborhood    21       3      18
# 6 Neighborhood    56      46      10

更新:没过多久就明白了!只需将列放置在向量中:

# concise AND working!
df %>% mutate(across(c(total, group_a, group_b)), ifelse(str_detect(type, "Park"), NA, .))

我最初尝试过这个,但把这些列放在引号里。。。不要这样做:)

这里是data.table解决方案

require(data.table)
df <- data.frame("type" = c("Park", "Neighborhood", "Airport", "Park", "Neighborhood", "Neighborhood"),
               "total" = c(34, 56, 75, 89, 21, 56),
               "group_a" = c(30, 26, 45, 60, 3, 46),
               "group_b" = c(4, 30, 30, 29, 18, 10))

setDT(df)
df[type == "Park", c("total", "group_a", "group_b") := NA]
require(data.table)

df实际上这个答案不起作用,因为您得到一个名为
felse(str_detect(type,“Park”),NA,)
(至少在我的例子中是这样)。请查看我上面的答案。谢谢你的帮助!有趣的是,这适用于我的虚拟数据集,但当我将完全相同的语法应用于我更大的真实数据集时,情况就不一样了。。。我一直收到这样的错误消息:错误:
mutate()
input
.2
有问题。x输入
.2
必须是向量,而不是
公式
对象。我输入的
.2
是`~ifelse(str_detect(long_name,“park-celember”),NA,``你有没有想过为什么它会在一个更大的数据集上抛出这个错误?你还在传递你想用
c(变量1,变量2,…)变异的变量呢,完全一样。您可以使用
dput
功能共享较大数据的样本,并将输出粘贴到您的问题中吗?另外,你能粘贴你用来得到那个错误的代码吗?啊,错放的括号的诅咒!谢谢你的帮助!
require(data.table)
df <- data.frame("type" = c("Park", "Neighborhood", "Airport", "Park", "Neighborhood", "Neighborhood"),
               "total" = c(34, 56, 75, 89, 21, 56),
               "group_a" = c(30, 26, 45, 60, 3, 46),
               "group_b" = c(4, 30, 30, 29, 18, 10))

setDT(df)
df[type == "Park", c("total", "group_a", "group_b") := NA]