【问题标题】:R: use of ddply on a data frame with categorical variableR:在具有分类变量的数据帧上使用 ddply
【发布时间】:2014-10-01 04:35:20
【问题描述】:

正确的问题。

我有一个 data.frame(结构如下),主要是分类变量(大多数二进制,即是或否,一个具有三个级别(data.frame$tertile)。

'data.frame'::

 $ smoker        : Factor w/ 2 levels "Yes","No"

 $ mi            : Factor w/ 2 levels "Yes","No":

$ angina        : Factor w/ 2 levels "Yes","No": 

 $ pvd           : Factor w/ 2 levels "Yes","No": 

 $ isch.stroke   : Factor w/ 2 levels "Yes","No": 

 $ ht.1          : Factor w/ 2 levels "Yes","No": 

 $ tertile       : Factor w/ 3 levels "1","2","3": 

我想生成一个数据框,其中包含所有分类变量的汇总统计数据,即按 data.frame$tertile 分组的患者比例。

是否可以将 ddply 用于分类变量,我已设法将 ddply 用于连续变量

x <- ddply(data.frame,.(tertile), numcolwise(mean,))

但发现很难同时应用 catcolwise 函数和使用 ddply。

在此先感谢各位,并感谢任何回复。

问候

阿努普

【问题讨论】:

  • 如果您能提供代码来重现您的数据框,将会很有帮助。
  • 您似乎主要或只有因子变量。您认为“是”和“否”的含义是什么?

标签: r plyr


【解决方案1】:

你可以试试:

 fun1 <- function(x) round(100*(table(x)/length(x))[1],2)
 ddply(dat, .(tertile),colwise(fun1) )

数据

dat <- structure(list(smoker = structure(c(2L, 2L, 1L, 2L, 2L, 2L, 2L, 
1L, 2L, 2L), .Label = c("Yes", "No"), class = "factor"), mi = structure(c(1L, 
2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L), .Label = c("Yes", "No"), class = "factor"), 
angina = structure(c(2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 
2L), .Label = c("Yes", "No"), class = "factor"), pvd = structure(c(2L, 
2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L), .Label = c("Yes", "No"
), class = "factor"), isch.stroke = structure(c(1L, 1L, 1L, 
2L, 1L, 2L, 2L, 2L, 2L, 2L), .Label = c("Yes", "No"), class = "factor"), 
ht.1 = structure(c(1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L
), .Label = c("Yes", "No"), class = "factor"), tertile = structure(c(3L, 
3L, 3L, 2L, 3L, 1L, 1L, 3L, 3L, 1L), .Label = c("1", "2", 
"3"), class = "factor")), .Names = c("smoker", "mi", "angina", 
"pvd", "isch.stroke", "ht.1", "tertile"), row.names = c(NA, -10L
), class = "data.frame")


  ddply(dat, .(tertile),colwise(fun1) )
#  tertile smoker     mi angina   pvd isch.stroke ht.1
#1       1   0.00   0.00  33.33 33.33        0.00    0
#2       2   0.00 100.00   0.00  0.00        0.00    0
#3       3  33.33  66.67  50.00 50.00       66.67  100

或使用dplyr

 library(dplyr)
  dat%>%
  group_by(tertile)%>% 
  summarise_each(funs(fun1))
  #Source: local data frame [3 x 7]

 #   tertile smoker     mi angina   pvd isch.stroke ht.1
 #1       1   0.00   0.00  33.33 33.33        0.00    0
 #2       2   0.00 100.00   0.00  0.00        0.00    0
 #3       3  33.33  66.67  50.00 50.00       66.67  100

【讨论】:

  • thanksa Akrun 和 BBrill...工作出色,为我节省了很多时间...你们都是传奇。
【解决方案2】:

要知道“是”和“否”的比例,请计算逻辑评估给出TRUE 的次数(TRUE = 1,FALSE = 0)

nYes &lt;- function(x) 100*(sum(x=="Yes")/length(x)

制作一些虚拟数据

vec <- c("Yes","No")
vec2 <- c(1,2,3)
tmp <- data.frame("smoker" = sample(vec,10, replace=TRUE),
             "mi" = sample(vec,10, replace=TRUE),
             "tertile" = sample(vec2,10, replace=TRUE))

然后使用ddply

ddply(tmp, .(tertile), colwise(nYes))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多