在表A中查找字符串并将其替换为表B

时间:2016-02-14 10:22:23

标签: r replace

我有一个带有标记化字符串的表(数据框1)。这些单词需要用我读入R的CSV中的数值替换。 我使用了以下命令

library(dplyr)
df1 <- data.frame(tweetsContent, stringsAsFactors = FALSE)
names(df1) <- c('word')
cct <- read.csv('concNorm.csv')  
names(cct) <- c('word','concreteness')
cct <- scan_tokenizer(cct[1])
df2 <- data.frame(cct)
result <- semi_join(df1, df2, by='word')

我得到的错误消息如下:

  

UseMethod错误(&#34; semi_join&#34;):没有适用于&#39; semi_join&#39;的方法   应用于类&#34;字符&#34;。

的对象

我不知道为什么类字符应该是一个问题,因为DPLYR包没有为JOIN函数指定任何数据类型。加载DPLYR时,我不会收到错误消息。我也看了gsub但是所有的例子似乎都用相应的B替换了某个A?在我的例子中,A采用不同的值,即不同的词,因此具有不同的对应值。

可以找到更新文件here

2 个答案:

答案 0 :(得分:1)

我做出以下假设:

  • mydf包含一个包含标记化字符串
  • 的变量字
  • cct包含与每个标记化字符串相同的变量字 值数值
  • 每个标记化字符串在数据帧cct
  • 中只出现一次

然后你只需:

sel.id <- match(mydf$word, cct$word)
mydf$thenumber <- cct$thenumber[sel.id]

这比任何merge()或join()解决方案都更容易,也更快。

可重现的数据集:

mydf <- data.frame(word = sample(letters[1:4], 10 , replace = TRUE))
cct <- data.frame(word = letters[1:4],
                  thenumber = 1:4)

如果你想要替换它们,显然你可以通过改变第二行来覆盖原始变量:

mydf$word <- cct$thenumber[sel.id]

答案 1 :(得分:0)

所以最后我做到了。似乎我用来清理字符串数据的其他代码行导致了变量类型和问题的问题。编码。如上所述,添加'encoding ='UTF-8'或将变量指定为字符串或数字并不能解决问题。所以我重写了一些清洁代码。下面的代码有效。

library('stringr', 'tm', 'dplyr')

df <- data.frame(tweetsText, stringsAsFactors = FALSE)
names(df) <- c('words')
df$words<-gsub("[[:punct:]]", "", df$words) 
df$words <- str_replace_all(df$words,"[^[:graph:]]", " ")
df$words<-tolower(df$words)
df$words <- removeNumbers(df$words)
my.stopwords <- c("house", stopwords("english"))
df$words <- removeWords(df$words, my.stopwords)
words <- strsplit(df$words, split = " ")
df<-data.frame(words = unlist(words))
names(df) <-c('words')
cct <- read.table('concNorm.csv', sep = ",") 
names(cct) <- c('words','concreteness')
tog <- inner_join(df,cct, by ='words')

我无法在我的数据集中修复sel.id选项,既没有使用旧的“清洁代码”也没有修复新的清洁代码。我认为它可能适用于不同的数据。