如何获得R中所有完整数据帧列的频率表?

San*_*sra 2 r

我想从数据框创建一个频率表并将其保存在excel中.使用table()函数i只能创建特定列的频率.但我想为所有列创建频率表,对于每列,变量的级别或类型也可能不同.就像数据框的总结一样,但不会有平均或其他措施,只有频率.我正在尝试这样的事情

 for(i in 1:230){
 rm(tb)
 tb<-data.frame(table(mydata[i]))
 tb2<-cbind(tb2,tb)
 }
Run Code Online (Sandbox Code Playgroud)

但它显示以下错误

data.frame(...,check.names = FALSE)中的错误:参数意味着行数不同:15,12

代替cbind()我也使用data.frame()但错误没有改变.

Ant*_*osK 5

也许rbind解决方案更好,因为它允许您处理不同级别的变量:

dt = data.frame(x = c("A","A","B","C"),
                y = c(1,1,2,1))

dt

#   x y
# 1 A 1
# 2 A 1
# 3 B 2
# 4 C 1

dt_res = data.frame()

for (i in 1:ncol(dt)){

dt_temp = data.frame(t(table(dt[,i])))
dt_temp$Var1 = names(dt)[i]

dt_res = rbind(dt_res, dt_temp)

}

names(dt_res) = c("Variable","Levels","Freq")

dt_res

#   Variable Levels Freq
# 1        x      A    2
# 2        x      B    1
# 3        x      C    1
# 4        y      1    3
# 5        y      2    1
Run Code Online (Sandbox Code Playgroud)

使用apply的替代(可能更快)过程:

dt = data.frame(x = c("A","A","B","C"),
                y = c(1,1,2,1))

dt

ff = function(x){

  y = data.frame(t(table(x)))
  y$Var1 = NULL
  names(y) = c("Levels","Freq")
  return(y)
}

dd = do.call(rbind, apply(dt, 2, ff)) 

dd

#     Levels Freq
# x.1      A    2
# x.2      B    1
# x.3      C    1
# y.1      1    3
# y.2      2    1


# extract variable names from row names
dd$Variable = sapply(row.names(dd), function(x) unlist(strsplit(x,"[.]"))[1])

dd

#     Levels Freq Variable
# x.1      A    2        x
# x.2      B    1        x
# x.3      C    1        x
# y.1      1    3        y
# y.2      2    1        y
Run Code Online (Sandbox Code Playgroud)


hpe*_*626 5

您收到错误消息,因为您正在尝试组合具有不同维度的数据框。据我了解,您的问题有两个方面:(1)无论类型如何,您都希望获得每列的频率分布;并且,(2) 您想将所有结果保存在一个 Excel 工作表中。

对于第一个问题,您可以使用该mapply()功能。

set.seed(1)

dat <- data.frame(
  x = sample(LETTERS[1:5], 15, replace = TRUE),
  y = rbinom(5, 15, prob = 0.4)
)

mylist <- mapply(table, dat); mylist

# $x
# 
# A B C D E 
# 2 5 1 4 3 
# 
# $y
# 
# 5  6  7 11 
# 3  3  6  3 
Run Code Online (Sandbox Code Playgroud)

您也可以使用purrr::map().

library(purrr)
dat %>% map(table)
Run Code Online (Sandbox Code Playgroud)

第二个问题在这个问题中有几个解决方案:将列表导出到 R 中的 CSV 或 TXT 文件。特别是,LyzandeR 的答案将使您能够按照自己的意愿行事。如果您更喜欢将输出保存在单独的文件中,您可以执行以下操作:

mapply(write.csv, mylist, file=paste0(names(mylist), '.csv'))
Run Code Online (Sandbox Code Playgroud)