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