我想从数据框创建一个频率表并将其保存在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()但错误没有改变.
也许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)
您收到错误消息,因为您正在尝试组合具有不同维度的数据框。据我了解,您的问题有两个方面:(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)
| 归档时间: |
|
| 查看次数: |
5418 次 |
| 最近记录: |