计数只有特殊字符R的单元格

时间:2014-09-03 20:04:07

标签: r count

我有一个data.frame如下。我想得到一个单元格列表,它们甚至没有单个数字或a-to-z及其频率。我怎么能这样做?如果是以下数据,我想要一张桌子。在表格的第一栏中,我将有*和。这些第二列将显示这些值的频率(分别为1和2)。 " *"和" 21.9"不会出现,因为它们至少包含一个数字或a-z

sm <- matrix(c(51,".",22,"*","a*","21.9",".",22,9),ncol=3,byrow=TRUE)
smdf<-as.data.frame(sm)

1 个答案:

答案 0 :(得分:1)

这是否能满足您的需求?

require(plyr)
sm <- matrix(c(51,".",22,"*","a*","21.9",".",22,9),ncol=3,byrow=TRUE)
count(sm[!grepl("[[:alnum:]]", sm)])

  x freq
1 *    1
2 .    2

如果您还要排除NA和空格,您可以轻松地向过滤器添加适当的条件。作为旁注,我相当肯定一个更优雅的正则表达式可以解决这个没有额外的参数但我的正则表达式技能正在进行中。如果我设法找出这样的东西,我会更新。

sm <- matrix(c(51,".",22,"*","a*","21.9",".",22,9, " ", NA, 13),ncol=3,byrow=TRUE)
count(sm[!grepl("[[:alnum:]]", sm) & !is.na(sm) & sm != " "])

  x freq
1 *    1
2 .    2

但是,如果您想要计算一个特定的字符列表,则可以始终创建字符向量并仅计算这些字符。这不需要额外的“空间”和“NA”组件。

sm <- matrix(c(51,".",22,"*","a*","21.9",".",22,9, " ", NA, 13),ncol=3,byrow=TRUE)
x <- unlist(strsplit("*~!@#$%^&(){}_+:\"<>?,./;'[]-=", split=""))
count(sm[sm %in% x])

  x freq
1 *    1
2 .    2