根据字符值将数据帧拆分为子集

时间:2018-06-16 13:44:34

标签: r subset linear-regression logistic-regression

我想对调查数据中受访者的4个不同社会经济水平进行同样的回归。

例如:

educational_level (of subset 1) = ß0 + ß1*educational_level_father + ß2*race + ... +u 

educational_level (of subset 2)= ß0 + ß1*educational_level_father + ß2*race + ... +u 

......等等。如何基于其中一个特定变量(列)的值来划分data.frame

2 个答案:

答案 0 :(得分:0)

一种方法涉及循环子集列中的唯一值。请查看forsubset

> data("iris")  ## A data set
> unique_species <- unique(iris$Species)  ## Get the unique values of the subsetting column
> results <- list()  ## Set up a list to store the regressions you will run within the loop
> for (species in unique_species) {  ## Loop over each unique value
+     data_subset <- subset(iris, iris$Species == species)  ## Subset based on the desired value
+     results[[species]] <- lm(Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, 
                               data=data_subset)  ## Run each regression
+ }

这将产生:

> results
$setosa

Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, 
    data = data_subset)

Coefficients:
 (Intercept)   Sepal.Width  Petal.Length   Petal.Width  
      2.3519        0.6548        0.2376        0.2521  


$versicolor

Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, 
    data = data_subset)

Coefficients:
 (Intercept)   Sepal.Width  Petal.Length   Petal.Width  
      1.8955        0.3869        0.9083       -0.6792  


$virginica

Call:
lm(formula = Sepal.Length ~ Sepal.Width + Petal.Length + Petal.Width, 
    data = data_subset)

Coefficients:
 (Intercept)   Sepal.Width  Petal.Length   Petal.Width  
      0.6999        0.3303        0.9455       -0.1698  

只有4个级别,这应该是合理有效的。

答案 1 :(得分:0)

base-R解决方案是:

dat.list <- split(x=YourData, f = as.factor(YourData$YourCharacter)
summary(lm(educ ~ educ_father, data=dat.list[[1]]))
summary(lm(educ ~ educ_father, data=dat.list[[2]]))
summary(lm(educ ~ educ_father, data=dat.list[[3]]))
summary(lm(educ ~ educ_father, data=dat.list[[4]]))

或者,您可以将回归结果分配给带有一个for循环的列表。

如果您正在寻找更有效的解决方案(例如,您有大数据),则应实施nest-map-unnest工作流程。我个人希望实现此目标是依靠tidyverse的一部分broompurrdplyr软件包。您可以检查来自this vignette的一些代码。其他解决方案当然是可能的。