【问题标题】:Subset columns in df using for loop in R使用R中的for循环对df中的列进行子集
【发布时间】:2021-02-05 19:21:27
【问题描述】:

我想将一个数据集子集为几个较小的 df,而 在 for 循环中使用列的名称。

创建一些数据(这可能更容易完成......)

Line1 <- c(1:7)
Line2 <- c(3:9)
df <- rbind(Line1, Line2)
ColumnNames <- c(paste0("Var", 1:7))
df <- lapply(df, setNames, ColumnNames)
colnames(df)=ColumnNames

作为输出,我想要三个数据框: Df_Sub1、Df_Sub2 和 Df_Sub3。

Sub1 <- c("Var1", "Var2", "Var3")
Sub2 <- c("Var3", "Var4")
Sub3 <- c("Var5", "Var6", "Var7")

Subs <- c("Sub1", "Sub2", "Sub3")

for循环创建三个子集

for (Sub in Subs) { 
  name <- as.name(paste0("df_",Sub))
  df_ <- df[,colnames(df) %in% get(Sub)]
}
 

如何在 df_ 之后为三个 Subs 中的每一个添加名称(或做其他事情来完成这项工作)?

【问题讨论】:

  • 第一次尝试使用lapply 设置名称失败,因为此时对象不是data.frame。另外,get 的使用是不必要的。

标签: r dataframe for-loop subset columnname


【解决方案1】:

我们可以使用mget返回list中的对象值,循环list,选择'df'的列,然后使用list2env在全局环境中创建对象

list2env(lapply(setNames(mget(Subs), paste0("Df_", Subs)),
        function(x) df[,x]), .GlobalEnv)

-输出

Df_Sub1
#      Var1 Var2 Var3
#Line1    1    2    3
#Line2    3    4    5
Df_Sub2
#      Var3 Var4
#Line1    3    4
#Line2    5    6
Df_Sub3
#      Var5 Var6 Var7
#Line1    5    6    7
#Line2    7    8    9

【讨论】:

    【解决方案2】:

    循环选项意味着将向量存储在列表中:

    #Data
    Line1 <- c(1:7)
    Line2 <- c(3:9)
    df <- rbind(Line1, Line2)
    ColumnNames <- c(paste0("Var", 1:7))
    colnames(df)=ColumnNames
    #Data 2
    Sub1 <- c("Var1", "Var2", "Var3")
    Sub2 <- c("Var3", "Var4")
    Sub3 <- c("Var5", "Var6", "Var7")
    Subs <- c("Sub1", "Sub2", "Sub3")
    #Store in a list
    List <- list(Sub1=Sub1,Sub2=Sub2,Sub3=Sub3)
    #List for data
    List2 <- list()
    #Loop
    for(i in Subs)
    {
      List2[[i]] <- df[,List[[i]],drop=F]
    }
    #Format names
    names(List2) <- paste0('df_',names(List2))
    #Set to envir
    list2env(List2,envir = .GlobalEnv)
    

    输出:

    df_Sub1
          Var1 Var2 Var3
    Line1    1    2    3
    Line2    3    4    5
    
    df_Sub2
          Var3 Var4
    Line1    3    4
    Line2    5    6
    
    df_Sub3
          Var5 Var6 Var7
    Line1    5    6    7
    Line2    7    8    9
    

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 2015-06-20
      • 2021-06-23
      • 2018-06-21
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多