在r中使用dplyr查找和替换列值
虽然我发现很少有讨论,但在dplyr中找不到合适的解决方案 我的主表由50多列组成,有15个查找表。每个查找表大约有8-15列。我有多个查找要执行,由于select语句通过选择或用减号删除变得非常混乱,我希望能够动态替换列值 使用dplyr是否可以实现这一点?为了更好地理解,我在下面提供了一个示例数据 我想用表格中的city和lcity进行VLOOKUP-like excel的查找,并用newcity替换city的值 我的输出表应该是在r中使用dplyr查找和替换列值,r,replace,dplyr,vlookup,R,Replace,Dplyr,Vlookup,虽然我发现很少有讨论,但在dplyr中找不到合适的解决方案 我的主表由50多列组成,有15个查找表。每个查找表大约有8-15列。我有多个查找要执行,由于select语句通过选择或用减号删除变得非常混乱,我希望能够动态替换列值 使用dplyr是否可以实现这一点?为了更好地理解,我在下面提供了一个示例数据 我想用表格中的city和lcity进行VLOOKUP-like excel的查找,并用newcity替换city的值 我的输出表应该是 name city rno 1 a n
name city rno
1 a nhyd 101
2 b nsbad 102
3 c nhyd 103
4 d nsbad 104
5 e nothers 105
6 f <NA> 106
我在下面尝试了动态更新值的代码,但这会创建另一个数据帧/表,而不是字符向量
table$city <- select(left_join(table,lookup,by=c("city"="lcity")),"newcity")
一种解决办法可以是:
注意:OP显示的数据和使用命令创建的数据对于查找是不同的。我使用了OP以表格格式查找的数据
library(dplyr)
# Data from OP
table <- data.frame(name = c("a","b","c","d","e","f"),
city = c("hyd","sbad","hyd","sbad","others","unknown"),
rno = c(101,102,103,104,105,106),stringsAsFactors=FALSE)
lookup <- data.frame(lcity = c("hyd","sbad","others","test"),
newcity = c("nhyd","nsbad","nothers","ntest"),
rating = c(10,20,40,55),newrating = c(100,200,400,550),
stringsAsFactors = FALSE)
table %>%
inner_join(lookup, by = c("city" = "lcity")) %>%
mutate(city = newcity) %>%
select(name, city, rno)
name city rno
1 a nhyd 101
2 b nsbad 102
3 c nhyd 103
4 d nsbad 104
5 e nothers 105
创建查找数据框的语法中缺少列newcity。你应该改正,否则会使其他读者感到困惑。谢谢,对不起。。现在更新它。谢谢,很好。谢谢我的答案可以解决它。我希望如此。不幸的是,最初我们花了一些时间来找出奇怪行为的原因或查找数据帧错误的原因。。现在修好了。在我的例子中,select语句的问题是我有大约40-50列,它在不同的阶段得到更新。除了调用单个列,还有其他选择吗names@Sat您可以忽略您不想要的列。或者先看一看,不选择,你就会知道要删除哪些列。@Sat你可以在我的回答中将select替换为select-newcity,-rating,-newrating,结果将是一样的。我应该早点说清楚。感谢您的代码按预期工作。但我有很多这样的查找要执行,大约有15个查找表。每个查找表大约有8-15列。由于select语句变得非常混乱,所以我希望看到替换的替代方法。我完全理解,但不幸的是,我无法共享原始数据,创建这么多查找是一项繁琐的工作,因此只提供了一个示例。我将等待其他人有一个想法可能。但是我已经编辑了我的主要查询。
library(dplyr)
# Data from OP
table <- data.frame(name = c("a","b","c","d","e","f"),
city = c("hyd","sbad","hyd","sbad","others","unknown"),
rno = c(101,102,103,104,105,106),stringsAsFactors=FALSE)
lookup <- data.frame(lcity = c("hyd","sbad","others","test"),
newcity = c("nhyd","nsbad","nothers","ntest"),
rating = c(10,20,40,55),newrating = c(100,200,400,550),
stringsAsFactors = FALSE)
table %>%
inner_join(lookup, by = c("city" = "lcity")) %>%
mutate(city = newcity) %>%
select(name, city, rno)
name city rno
1 a nhyd 101
2 b nsbad 102
3 c nhyd 103
4 d nsbad 104
5 e nothers 105