在R中按类型对数据进行排序

3

我在为一个长这样的数据集编写函数时遇到了困难:

identifier   age   occupation        
pers1        18    student   
pers2        45    teacher   
pers3        65    retired   

我尝试编写一个函数,能够完成以下操作:
  1. 将我的变量按数字和分类变量排序
  2. 对于数字变量,给出均值、最小值和最大值
  3. 对于分类变量,给出频率表
  4. 以“漂亮”的形式(数据框、向量或表)返回点(2)和(3)
到目前为止,我已尝试了这个:
describe<- function(x) 
{ if (is.numeric(x)) { mean <- mean(x)
                   min <- min(x)
                   max <- max(x) 
                   d <- data.frame(mean, min, max)}
  else { factor <- table(x) }
}
stats <- lapply(data, describe)

问题: 我的问题是,现在,“stats”是一个难以阅读、难以导出到Excel或共享的列表。我不知道如何使列表“stats”更具可读性。 或者,也许有一种更好的方法来构建函数“describe”吗? 非常感谢任何关于如何解决这两个问题的想法!

你认为 summary(data)[c(1,4,6),] 怎么样? - G5W
尝试使用sapply代替。请查看其帮助页面,参数simplify - Rui Barradas
@G5W - 谢谢!那个方法可行,只是数据集有168个变量,所以手动操作有点冗长。 :) - cremorna
@RuiBarradas - 谢谢!我会试一下。 - cremorna
2个回答

2

我可能来晚了,但或许你仍需要一个解决方案。我将你的帖子中一些评论的答案结合起来,得到了以下代码。它假设你只有数字列和因子,并且可以适应大量列,就像你所指定的那样:

# Just some sample data for my example, you don't need ggplot2.
library(ggplot2)
data=diamonds

# Find which columns are numeric, and which are not.
classes = sapply(data,class)
numeric = which(classes=="numeric")
non_numeric = which(classes!="numeric")

# create the summary objects    
summ_numeric = summary(data[,numeric])
summ_non_numeric = summary(data[,non_numeric])

# result is easily written to csv
write.csv(summ_non_numeric,file="test.csv")

希望这有所帮助。

谢谢!这太棒了,而且它能正常工作,也是我所想的最接近的。 - cremorna
很高兴知道它对你有帮助,感谢分享你的进展! - Florian

1
所需功能已经在其他地方可用,如果您不想自己编写代码,则可以使用此功能。 Publish 包可用于生成一张表格以在论文中展示。它不在 CRAN 上,但您可以从 Github 安装它。
devtools::install_github('tagteam/Publish')
library(Publish)
library(isdals)  # Get some data
data(fev)        
fev$Smoke <- factor(fev$Smoke, levels=0:1, labels=c("No", "Yes"))
fev$Gender <- factor(fev$Gender, levels=0:1, labels=c("Girl", "Boy"))
< p > univariateTable 可以生成一个呈现数据的出版准备表格。默认情况下,univariateTable 计算数值变量的均值和标准差,以及因子类别中观察结果的分布。这些值可以在组之间进行计算和比较。 univariateTable 的主要输入是一个公式,其中右侧列出要包含在表格中的变量,而左侧(如果存在)则指定分组变量。

univariateTable(Smoke ~ Age + Ht + FEV + Gender, data=fev)

这会产生以下输出。
  Variable     Level No (n=589) Yes (n=65) Total (n=654) p-value
1      Age mean (sd)  9.5 (2.7) 13.5 (2.3)     9.9 (3.0)  <1e-04
2       Ht mean (sd) 60.6 (5.7) 66.0 (3.2)    61.1 (5.7)  <1e-04
3      FEV mean (sd)  2.6 (0.9)  3.3 (0.7)     2.6 (0.9)  <1e-04
4   Gender      Girl 279 (47.4)  39 (60.0)    318 (48.6)        
5                Boy 310 (52.6)  26 (40.0)    336 (51.4)  0.0714

听起来是个很棒的软件包。但是,我无法安装它,我收到以下错误信息:
library(devtools) 警告信息: package ‘devtools’ was built under R version 3.3.3 devtools::install_github('tagteam/Publish') 从 URL https://api.github.com/repos/tagteam/Publish/zipball/master 下载 GitHub repo tagteam/Publish@master 安装失败:'exdir' does not exist library(Publish) Error in library(Publish) : there is no package called ‘Publish’
- cremorna
啊,也许是时候联系作者(不是我)并提出问题了。 - ekstroem
哦,你在使用 R 3.4 吗?也许是时候更新你的 devtools 包了。 - ekstroem
更新了所有的软件包,但还是不起作用... :) 不过我真的很感激你的帮助。 - cremorna
也许是写入权限的问题。请参考这个类似的问题 - ekstroem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接