我有Data和10 000 Observations,变量名为Com,输入Factor带有3000 Levels。我在这里要做的是在变量Com中找到类似的值模式,然后将其组合成一个。所以,我可以稍后再做分析。str of Data如下所示:
> Data
'data.frame': 10000 obs. of 1 variable:
$ Com: Factor w/ 3000 levels示例:Frequency of Com
> Frequency<-data.frame(Com=c("C/C++ PROGRAMMING", "C; C++ PROGRAMMING", "C++ PROGRAMMING", "C++", "PROGRAMMING C++", "C", "C PROGRAMMING", "C, C++ PROGRAMMING", "PROGRAMMING IN C; C++", "PROGRAMMINGS IN C/C++","PROGRAMMING IN C/C++", "PROGRAMMING (C, C++, CUDA)"), Freq=c(2,3,3,1,2,5,6,2,1,3,4,5))
> Frequency
Com Freq
1 C/C++ PROGRAMMING 2
2 C; C++ PROGRAMMING 3
3 C++ PROGRAMMING 3
4 C++ 1
5 PROGRAMMING C++ 2
6 C 5
7 C PROGRAMMING 6
8 C, C++ PROGRAMMING 2
9 PROGRAMMING IN C; C++ 1
10 PROGRAMMINGS IN C/C++ 3
11 PROGRAMMING IN C/C++ 4
12 PROGRAMMING (C, C++, CUDA) 5 # Just add one more situation我希望Frequency的结果是:
> Frequency
Com Freq
1 C/C++ PROGRAMMING 15
2 C++ PROGRAMMING 6
3 C PROGRAMMING 11
4 PROGRAMMING (C, C++, CUDA) 5为此,我可以对Com的级别进行重新编码。但是,这个变量3000 Levels是(Com),我必须一个接一个地找到它,这将占用我的时间。
那么,在不花费那么多时间的情况下,还有其他方法可以做到这一点吗?我试过看Pattern matching and replacement in R,但仍然不能解决这个问题。
提前谢谢。
发布于 2014-04-18 10:30:34
您可以在一些步骤中使用正则表达式:
dat$Freq <- as.numeric(dat$Freq)
dat$Com[grep('.*(C).*(C[++]).*',dat$Com)] <- 'ccplusplus'
dat$Com[grep('C[++]',dat$Com)] <- 'cplusplus'
dat$Com[grep('C',dat$Com)] <- 'c'
tapply(dat$Freq,dat$Com,sum)
# c ccplusplus cplusplus
# 11 15 6发布于 2014-04-18 10:08:18
在包stringr中,您可以很容易地利用str_detect,并且可以通过考虑要分组的模式有哪些共同之处来工作。我可以猜到这是一项艰苦的工作,但我不认为R能进入你的头脑,找到你认为“相似”的东西。
举个例子:
df$Com_grouped <- NA
df$Com_grouped <- ifelse(str_detect(df$Com, "C") & (!str_detect(df$Com, "C[++]")), "C PROGRAMMING", df$Com_grouped)最后:tapply(df$Freq, df$Com_grouped, sum),这样你就可以得到频率。
https://stackoverflow.com/questions/23151453
复制相似问题