计算并列出所有因素的所有因子水平

时间:2017-11-04 11:56:56

标签: r dataframe

我在R中有一个像这样的数据框:

 D          I        S       ...

 110       2012     1000
 111       2012     2000
 110       2012     1000
 111       2014     2000
 110       2013     1000
 111       2013     2000

我想计算每个因素有多少因子水平,并在这样的DF中安全:

 D     Count          I    Count           S    Count    ...

 110     3           2012      3          1000     3
 111     3           2013      2          2000     3
                     2014      1  

或者这个:

 D     Count    

 110     3     
 111     3     


  I    Count  

2012      3  
2013      2  
2014      1


 S    Count  

1000     3
2000     3

...

我尝试使用sapply,levels,library(dplyr)或aggregate进行,但它不会产生所需的输出。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

这是使用data.table

的句子
data <- data.frame(D = rep(c("110", "111"), 3),
                   I = c(rep("2012", 3), "2014", "2013", "2013"),
                   S = rep(c("1000", "2000"), 3))
str(data)
# you just want
table(data$D)
table(data$I)
table(data$S)
# one option using data.table
require(data.table)
dt <- as.data.table(data)
dt # see dt
dt[, table(D)] # or dt[, .N, by = D], for one variable
paste(names(dt), "Count", sep = "_") # names of new count columns
dt[, paste(names(dt), "Count", sep = "_") := lapply(.SD, table)]
dt # new dt
data2 <- as.data.frame(dt)[, sort(names(dt))]
data2 # final data frame

dplyr用于第二个输出。

counts <- data %>% 
  lapply(table) %>% 
  lapply(as.data.frame)
counts

答案 1 :(得分:1)

我认为最有效的方法是在代码长度和以最终格式存储最终输出方面做到这一点:

library(tidyverse)

# example data
data <- data.frame(D = rep(c("110", "111"), 3),
                   I = c(rep("2012", 3), "2014", "2013", "2013"),
                   S = rep(c("1000", "2000"), 3))

data %>%
  gather(name,value) %>%  # reshape datset
  count(name, value)      # count combinations

# # A tibble: 7 x 3
#    name value     n
#   <chr> <chr> <int>
# 1     D   110     3
# 2     D   111     3
# 3     I  2012     3
# 4     I  2013     2
# 5     I  2014     1
# 6     S  1000     3
# 7     S  2000     3

第1列表示因子变量的名称。 第二列具有每个变量的唯一值。 第三栏是柜台。

答案 2 :(得分:0)

我认为简单的方法是使用“ plyr” R库。

library(plyr)

count(data$D)
count(data$I)
count(data$S)

它将给你

> count(data$D)
   x freq
1 110    3
2 111    3

> count(data$I)
    x freq
1 2012    3
2 2013    2
3 2014    1

> count(data$S)
    x freq
1 1000    3
2 2000    3