通过匹配字符串来计算R频率

时间:2014-07-08 18:03:22

标签: r

有人可以帮我解决这个问题吗?非常感谢!

我有一些这样的数据:

    A             B
fruit     red apple
fruit   green apple
fruit  yellow apple
fruit          kiwi
fruit   golden kiwi
juice   apple juice
juice  orange juice

我希望得到以下内容:

    A             B         freq
fruit         apple            3
fruit          kiwi            2
juice         apple            1
juice        orange            1

我可以在B中提供要搜索的字符串向量(即我知道我想要查找" apple"," kiwi"和" orange&#34 )。例如,如果有一个"香蕉" in" fruit"而且我没有"香蕉"在我想要搜索的项目列表中,只需显示" banana"在freq 1的结果中。

5 个答案:

答案 0 :(得分:2)

使用table计算具有特定值的观察数量:

library(stringr)
table(paste(df$A, str_extract(df$B, paste(lookingfor, collapse="|")), sep="."))
#  fruit.apple   fruit.kiwi  juice.apple juice.orange 
#            3            2            1            1 

在这里,paste(lookingfor, collapse="|")生成一个正则表达式,查找您的所有单词,str_extract提取您要查找的单词,外paste组合A变量提取的值(用.分隔)和table计算每个配对的计数。

答案 1 :(得分:1)

假设您的数据框名为df

library(dplyr)

df %>%
  mutate(categ = sapply(regmatches(B, regexec("apple|kiwi|orange",B)),'[',1)) %>%
  group_by(A,categ) %>%
  mutate(freq = n()) %>%
  select(A,B=categ,freq) %>%
  summarize(freq = first(freq))

返回

      A      B freq
1 fruit  apple    3
2 fruit   kiwi    2
3 juice  apple    1
4 juice orange    1

答案 2 :(得分:0)

这样的事情可能对你有用。它依赖于您提供的字符串向量与原始数据中的单词完全匹配的事实。

# your data
df <- data.frame(A = rep(c("fruit", "juice"), c(5, 2)),
    B = c("red apple", "green apple", "yellow apple", "kiwi", "golden kiwi", "apple juice", "orange juice"))

# vector of strings to search for
lookingfor <- c("apple", "kiwi", "orange", "banana")

# function to split up words in df$B and find those that match to those in looking for
found <- function(longname, shortnames) {
    splitlong <- strsplit(longname, " ")[[1]]
    index <- match(splitlong, shortnames)
    res <- if(all(is.na(index))) NA else shortnames[index[!is.na(index)][1]]
    res
    }

# apply the function to your data
df$C <- sapply(df$B, found, shortnames=lookingfor)

# summarize
aggregate(data.frame(freq=!is.na(df$C)), list(A=df$A, B=df$C), sum)

答案 3 :(得分:0)

这是一种方法。首先找出第一列中有多少“类别”。

categs <- unique(data[,1])
fruits <- c('apple','orange', 'kiwi') # or whatever
results<-matrix(ncol=3)

然后,对于categs中的每个值,搜索每种类型的已知水果。

for (j in 1:length(categs) ) {
    for (k in 1:length(fruits) ) {
        results[1 + j*(k-1),1]<-categs[j]
        results[1 + j*(k-1),2]<-fruits[j]
        results[1 + j*(k-1),1]<-sum(grepl(fruits[k],data[data[,1]==fruits[k],2]))
        }
    }

我没有测试过,所以毫无疑问我的索引错误。

答案 4 :(得分:0)

通过获取您拥有的数据集并声明它dat,您可以执行以下操作:

library(dplyr)

dat %>%

  mutate(B = sub(' juice', '', B),
         B = ifelse(grepl(' apple', B), 'apple', B),
         B = ifelse(grepl('golden ', B), sub('golden ', '', B), B)) %>%

group_by(A, B) %>%
summarise(count = n())

其他规则必须添加到mutate语句中。