计算R中一组变量中值的出现次数(每行)

时间:2014-06-03 12:45:31

标签: r count find-occurrences

假设我的数据框有10个数字变量V1-V10(列)和多行(个案)。

我希望R做的是:对于每种情况,给我一组变量中某个值的出现次数。

例如,V2,V3,V6的单行中数值99的出现次数,显然最小值为0(三者中没有一个值为99),最大值为3(全部为这三个人的价值是99)。

我真的在寻找与the SPSS function COUNT相当的东西:" COUNT 会创建一个数字变量,对于每种情况,它会计算相同值(或值列表)的出现次数。变量列表。"

我想过table()和图书馆plyr' count(),但我无法弄明白。矢量化计算首选。非常感谢!

5 个答案:

答案 0 :(得分:4)

我认为应该有一种更简单的方法来实现这一点,但是我能想到的最好的方法是获取计数表是在数据帧中的唯一值上循环(隐式使用sapply)。

#Some example data
df <- data.frame(a=c(1,1,2,2,3,9),b=c(1,2,3,2,3,1))
df
#  a b
#1 1 1
#2 1 2
#3 2 3
#4 2 2
#5 3 3
#6 9 1

levels=unique(do.call(c,df)) #all unique values in df
out <- sapply(levels,function(x)rowSums(df==x)) #count occurrences of x in each row
colnames(out) <- levels
out
#     1 2 3 9
#[1,] 2 0 0 0
#[2,] 1 1 0 0
#[3,] 0 1 1 0
#[4,] 0 2 0 0
#[5,] 0 0 2 0
#[6,] 1 0 0 1

答案 1 :(得分:3)

尝试

apply(df,MARGIN=1,table)

dfdata.frame。这将返回data.frame中行数相同长度的列表。列表的每个项目对应于data.frame的一行(以相同的顺序),并且它是一个表格,其中内容是出现次数,名称是对应的值。

例如:

df=data.frame(V1=c(10,20,10,20),V2=c(20,30,20,30),V3=c(20,10,20,10))
#create a data.frame containing some data
df #show the data.frame
  V1 V2 V3
1 10 20 20
2 20 30 10
3 10 20 20
4 20 30 10
apply(df,MARGIN=1,table) #apply the function table on each row (MARGIN=1)
[[1]]

10 20 
 1  2 

[[2]]

10 20 30 
 1  1  1 

[[3]]

10 20 
 1  2 

[[4]]

10 20 30 
 1  1  1 

#desired result

答案 2 :(得分:1)

这是另一个直接的解决方案,它最接近SPSS中的COUNT命令 - 创建一个新的变量,对于每种情况(即行)计算给定值或列表的出现次数变量列表中的值。

#Let df be a data frame with four variables (V1-V4)
df <- data.frame(V1=c(1,1,2,1,NA),V2=c(1,NA,2,2,NA),
       V3=c(1,2,2,1,NA), V4=c(NA, NA, 1,2, NA))

 #This is how to compute a new variable counting occurences of value "1" in V1-V4.      
    df$count.1 <- apply(df, 1, function(x) length(which(x==1)))

更新的数据框包含新的变量count.1,与SPSS COUNT命令完全相同。

 > df
      V1 V2 V3 V4 count.1
    1  1  1  1 NA       3
    2  1 NA  2 NA       1
    3  2  2  2  1       1
    4  1  2  1  2       2
    5 NA NA NA NA       0

你可以做同样的事情来计算价值&#34; 2&#34;在V1-V4中每行发生。请注意,您需要选择应用该函数的df中的列(变量)。

df$count.2 <- apply(df[1:4], 1, function(x) length(which(x==2)))

您还可以应用类似的逻辑来计算V1-V4中缺失值的数量。

df$count.na <- apply(df[1:4], 1, function(x) sum(is.na(x)))

最终结果应该是您想要的:

 > df
      V1 V2 V3 V4 count.1 count.2 count.na
    1  1  1  1 NA       3       0        1
    2  1 NA  2 NA       1       1        2
    3  2  2  2  1       1       3        0
    4  1  2  1  2       2       2        0
    5 NA NA NA NA       0       0        4

该解决方案可以很容易地推广到一系列值。 假设我们想要计算每行V1-V4中1 2的值出现的次数:

df$count.1or2 <- apply(df[1:4], 1, function(x) sum(x %in% c(1,2)))

答案 3 :(得分:1)

如果您需要计算该行中的任何特定单词/字母。

#Let df be a data frame with four variables (V1-V4)
             df <- data.frame(V1=c(1,1,2,1,L),V2=c(1,L,2,2,L),
             V3=c(1,2,2,1,L), V4=c(L, L, 1,2, L))

要计算每行中的L数,只需使用

#This is how to compute a new variable counting occurences of "L" in V1-V4.      
df$count.L <- apply(df, 1, function(x) length(which(x=="L")))

结果将显示如下

> df
  V1 V2 V3 V4 count.L
1  1  1  1 L       1
2  1  L  2 L       2
3  2  2  2  1      0
4  1  2  1  2      0

答案 4 :(得分:1)

为了从R中的SPSS查找类似于Count的内容,如下:

`df <- data.frame(a=c(1,1,NA,2,3,9),b=c(1,2,3,2,NA,1))` #Dummy data with NAs 

`df %>% 
  dplyr::mutate(count = rowSums( #this allows calculate sum across rows
    dplyr::select(., #Slicing on .  
                  dplyr::one_of( #within select use one_of by clarifying which columns your want
                    c('a','b'))), na.rm = T)) #once the columns are specified, that's all you need, na.rm is cherry on top

这就是输出的样子

> df a b count 1 1 1 2 2 1 2 3 3 NA 3 3 4 2 2 4 5 3 NA 3 6 9 1 10

希望它会有所帮助:-)