如何计算R中数据集中字符的出现次数

时间:2015-07-05 06:55:04

标签: r character

我目前正在玩一个模拟数据集,其中我记录了一种蜜蜂访问某一种花的次数。我的部分数据集可能如下所示:

Plant   Visitor.1   Visitor.2   Visitor.3
  1     Bombus      Bombus      NA
  2     Apis        Bombus      Apis
  3     NA          NA          NA
  4     Apis        NA          NA
  5     NA          NA          NA
  6     Apis        NA          NA
  7     Apis        Apis        Halictid
  8     Apis        Apis        NA
  9     Bombus      Halictid    Halictid
 10     NA          NA          NA
 11     NA          NA          NA
 12     NA          NA          NA
 13     Halictid    NA          NA

我有没有办法计算“Bombus”,“Apis”,“Halictid”等在每一列中出现多少次,或者甚至同时在所有三列中出现?我已经阅读了很多关于如何使用数据字符串执行此操作的内容,但是没有使用此类数据集。说实话,我不太清楚从哪里开始。

2 个答案:

答案 0 :(得分:3)

您可以尝试

library(qdapTools)
addmargins(t(mtabulate(df1[-1])),2)
#          Visitor.1 Visitor.2 Visitor.3 Sum
#Apis             5         2         1   8
#Bombus           2         2         0   4
#Halictid         1         1         2   4

如果只需要整个数据集的计数

table(unlist(df1[-1]))

#   Apis   Bombus Halictid 
#    8        4        4 

我不确定你是否需要每一行,即每个'工厂'。在那种情况下,

Un1 <- unique(na.omit(unlist(df1[-1])))
res <- t(apply(df1[-1], 1, FUN=function(x) table(factor(x, levels=Un1))))
cbind(res, Sum=rowSums(res))
#     Bombus Apis Halictid Sum
#[1,]      2    0        0   2
#[2,]      1    2        0   3
#[3,]      0    0        0   0
#[4,]      0    1        0   1
#[5,]      0    0        0   0
#[6,]      0    1        0   1
#[7,]      0    2        1   3
#[8,]      0    2        0   2
#[9,]      1    0        2   3
#[10,]     0    0        0   0
#[11,]     0    0        0   0
#[12,]     0    0        0   0
#[13,]     0    0        1   1

或使用mtabulate

 addmargins(as.matrix(mtabulate(as.data.frame(t(df1[-1])))),2)

更新

如果您需要columns(仅使用基础R),

addmargins(t(apply(df1[-1], 2, FUN=function(x) table(factor(x, levels=Un1)))))
#           Bombus Apis Halictid Sum
#Visitor.1      2    5        1   8
#Visitor.2      2    2        1   5
#Visitor.3      0    1        2   3
#Sum            4    8        4  16

或者更紧凑的版本

 addmargins(table(stack(df1[-1])[2:1]))
 #           values
 #ind         Apis Bombus Halictid Sum
 # Visitor.1    5      2        1   8
 # Visitor.2    2      2        1   5
 # Visitor.3    1      0        2   3
 # Sum          8      4        4  16

数据

df1 <- structure(list(Plant = 1:13, Visitor.1 = c("Bombus", "Apis", 
NA, "Apis", NA, "Apis", "Apis", "Apis", "Bombus", NA, NA, NA, 
"Halictid"), Visitor.2 = c("Bombus", "Bombus", NA, NA, NA, NA, 
"Apis", "Apis", "Halictid", NA, NA, NA, NA), Visitor.3 = c(NA, 
"Apis", NA, NA, NA, NA, "Halictid", NA, "Halictid", NA, NA, NA, 
NA)), .Names = c("Plant", "Visitor.1", "Visitor.2", "Visitor.3"
), class = "data.frame", row.names = c(NA, -13L))

答案 1 :(得分:0)

如果您只想要一个简单的解决方案,请尝试将以下代码复制并粘贴到R控制台:

##  Create an artificial data set.  
example.data = 
     data.frame(col1 = c("Bob", "Jane", "Mary"), col2 = c("Mary", "Joe", "Sam"))

##  Count how many times 'x' appears in each column of the data set.
##  Lets count how many times 'Bob' appears in each column.
apply(example.data, 2, function(x) length(which(x == 'Bob')))

希望有所帮助:)