首页 > 解决方案 > 有没有一种方法可以创建一个循环,为原来的 18 个变量中的每一个创建一个新变量?

问题描述

我有一个包含 4 个变量的数据集,其中一个变量是一个虚拟变量,说明个人是否从特定程序毕业(退出)。我需要创建一个循环,为 3 个变量中的每一个创建两个新变量(虚拟变量的平均值 = 1,虚拟变量的平均值 = 0)。这是我的代码,我想让它更有效率,因为之后我想为 exits == 0 创建一个新的 data.frame 并减去两者!。

 summary_means_1 = bf %>%
 filter(exits == 1) %>% 
 summarise(
 v1_1 = as.double(mean(bf$v25_grad, na.rm = TRUE)),
 v2_1 = as.double(mean(bf$v29_read, na.rm = TRUE)),
 v3_1 = as.double(mean(bf$v30_math, na.rm = TRUE))
 )

标签: r

解决方案


您可以使用plyr包执行此操作:

假设这是您的数据(简化):

df <- data.frame(Dummy=sample(0:1, 10, T), V1=rnorm(10, 10), V2=rpois(10, 0.5))

此代码将计算每列的平均值,由虚拟分割:

library(magrittr)
library(plyr)
df %>% 
   group_by(Dummy) %>% 
   summarise(Mean_V1=mean(V1, na.rm = T), 
             Mean_V2=mean(V2, na.rm = T))

您需要在该summarise部分中为每一列添加一个新行。

使用 baseR您可以使用colMeans子集数据:

colMeans(df[df$Dummy==0, -1])
colMeans(df[df$Dummy==1, -1])

或者你可以像这样组合它们:

data.frame(Col=c("V1", "V2"), 
           Mean_0=colMeans(df[df$Dummy==0, -1]), 
           Mean_1=colMeans(df[df$Dummy==1, -1]))

推荐阅读