使用R中的for循环在df中子集列

vptzau2j  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(106)

我想将一个数据集分成几个较小的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

作为输出,我希望有三个 Dataframe :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 (Sub in Subs) { 
  name <- as.name(paste0("df_",Sub))
  df_ <- df[,colnames(df) %in% get(Sub)]
}

如何在三个子函数的df_后面加上name(或者做一些其他的事情)?

5m1hhzi4

5m1hhzi41#

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

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
x8diyxa7

x8diyxa72#

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

#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

相关问题