在R循环中访问变量数据帧
如果我在循环中使用数据帧,如何使用可变数据帧名称(另外还有可变列名)来访问数据帧内容在R循环中访问变量数据帧,r,loops,variables,dataframe,R,Loops,Variables,Dataframe,如果我在循环中使用数据帧,如何使用可变数据帧名称(另外还有可变列名)来访问数据帧内容 dfnames <- c("df1","df2") df1 <- df2 <- data.frame(X = sample(1:10),Y = sample(c("yes", "no"), 10, replace = TRUE)) for (i in seq_along(dfnames)){ curr.dfname <- dfnames[i] #how can I
dfnames <- c("df1","df2")
df1 <- df2 <- data.frame(X = sample(1:10),Y = sample(c("yes", "no"), 10, replace = TRUE))
for (i in seq_along(dfnames)){
curr.dfname <- dfnames[i]
#how can I do this:
curr.dfname$X <- 42:52
#...this
dfnames[i]$X <- 42:52
#or even this doubly variable call
for (j in 1_seq_along(colnames(curr.dfname)){
curr.dfname$[colnames(temp[j])] <- 42:52
}
}
dfnames您可以使用get()
根据变量名称的字符串返回变量引用:
> x <- 1:10
> get("x")
[1] 1 2 3 4 5 6 7 8 9 10
但我真的认为这将是一个痛苦的过程。正如评论者所说,如果您可以将数据帧放入一个列表中,然后对其进行迭代,那么它的性能可能会更好,可读性也会更好。不幸的是,据我所知,get()
不是矢量化的,因此,如果您只有数据帧名称的字符串列表,则必须遍历该列表才能获得数据帧列表:
# build data frame list
df.list <- list()
for (i in 1:length(dfnames))
{
df.list[[i]] <- get(dfnames[i])
}
# iterate through data frames
for (cur.df in df.list)
{
cur.df$X <- 42:52
}
这将返回修改的数据帧列表(尽管您可以使用map()
、map\u-dfr()
和map\u-dfc()的变体)
,分别按行或列自动绑定已处理数据帧列表。前者使用列名而不是列位置进行连接,还可以使用.ID
参数和输入列表的名称添加ID列。因此,它在lappy()上添加了一些不错的功能
!您可以使用get()
根据变量名称的字符串返回变量引用:
> x <- 1:10
> get("x")
[1] 1 2 3 4 5 6 7 8 9 10
不过,我真的认为这将是一种痛苦的方法。正如评论员所说,如果你能将数据帧放入一个列表中,然后进行迭代,它可能会执行得更好,可读性更强。不幸的是,get()据我所知,
不是矢量化的,因此,如果您只有数据帧名称的字符串列表,则必须遍历该列表才能获得数据帧列表:
# build data frame list
df.list <- list()
for (i in 1:length(dfnames))
{
df.list[[i]] <- get(dfnames[i])
}
# iterate through data frames
for (cur.df in df.list)
{
cur.df$X <- 42:52
}
这将返回修改的数据帧列表(尽管您可以使用map()
、map\u-dfr()
和map\u-dfc()的变体)
,分别按行或列自动绑定已处理数据帧列表。前者使用列名而不是列位置进行连接,还可以使用.ID
参数和输入列表的名称添加ID列。因此,它在lappy()上添加了一些不错的功能
!将两个数据帧放在一个命名列表中。@joran,比如,dflistNo.list(df1=df1,df2=df2),您可以使用[[按名称或位置访问。您应该阅读列表。将两个数据帧放在一个命名列表中。@joran,比如,dflistNo.list(df1=df1,df2=df2),您可以使用[[按名称或位置访问。您应该阅读列表。这是一个有用的答案!我如何取消在函数中操作的数据帧的列表?(注意:一些数据帧本身包含列表,因此list2env(cur.df,.GlobalEnv)
会有问题。)我绝对不会再这样做了!给我半个小时找点早餐,我会给你一个更现代的答案?那太棒了!这100%适用于我现在所做的:)我已经在我的答案的末尾弹出了:)非常感谢!因此,数据帧中的许多列都是唯一的,需要单独处理-但是变量的一些转换是相同的,这就是为什么我试图编写此函数。我正在努力分别提取列表中的df
,即返回到df1
,df2`是单独的。您认为呢我知道怎么做吗?这是一个很有帮助的答案!我如何取消列出在函数中操作的数据帧?(注意:一些数据帧本身包含列表,因此list2env(cur.df,.GlobalEnv)
会有问题。)我绝对不会再这样做了!给我半个小时找点早餐,我会给你一个更现代的答案?那太棒了!这100%适用于我现在正在做的事情:)我在我的答案末尾弹出了:)太感谢了!所以,数据框中的许多列都是独特的,需要单独处理-但是变量的某些转换是相同的,这就是我试图编写此函数的原因。我正在努力逐个提取列表中的df
,即返回到df1
,df2`是分开的。你知道怎么做吗?