【问题标题】:How to loop dataframes by name in R如何在 R 中按名称循环数据帧
【发布时间】:2017-11-24 14:17:55
【问题描述】:

我无法按名称循环数据帧。并且不知道如何解决这个问题。我正在使用多年的人口普查数据,并且必须对多个数据集应用相同的操作。

这是我想做的一个简化示例。我创建了一个名为 df1 的数据集。并制作两份名为 df2 和 df3 的副本。假设对于每个数据帧,我想创建一个变量 3 (v3),即 v3=v1+v2。

我制作的循环不起作用。而且我不知道如何按名称正确循环日期框架。

v1<-c(1:10)
v2<-c(1:10)
df1<-data.frame(v1,v2)
df2<-df1
df3<-df1
x<-c("df1","df2","df3")
for (i in x) {v3<-v1+v2}

【问题讨论】:

标签: r loops


【解决方案1】:

您正在寻找的是getassign 函数。 例如,您可以像这样使用它:

df1 <- data.frame(v1 = 1:10, v2 = 1:10)
df2 <- df1
df3 <- df1

x <- c("df1","df2","df3")

for (i in x) {
  # load the dataset "i" to the tmp-variable
  tmp <- get(i)
  # do something
  tmp$v3 <- tmp$v1 + tmp$v2
  # assign the tmp variable to the value of "i" again
  assign(i, tmp)
}

# lets have a check
df1
#>    v1 v2 v3
#> 1   1  1  2
#> 2   2  2  4
#> 3   3  3  6
#> 4   4  4  8
#> 5   5  5 10
#> 6   6  6 12
#> 7   7  7 14
#> 8   8  8 16
#> 9   9  9 18
#> 10 10 10 20

df2
#>    v1 v2 v3
#> 1   1  1  2
#> 2   2  2  4
#> 3   3  3  6
#> 4   4  4  8
#> 5   5  5 10
#> 6   6  6 12
#> 7   7  7 14
#> 8   8  8 16
#> 9   9  9 18
#> 10 10 10 20

df3
#>    v1 v2 v3
#> 1   1  1  2
#> 2   2  2  4
#> 3   3  3  6
#> 4   4  4  8
#> 5   5  5 10
#> 6   6  6 12
#> 7   7  7 14
#> 8   8  8 16
#> 9   9  9 18
#> 10 10 10 20

改进

话虽如此,您可能不想这样做,而是尝试使用 apply-family 命令。

我通常倾向于大量使用lapply-函数。在您的情况下,它看起来像这样:

# create some data again
df <- data.frame(v1 = 1:10, v2 = 1:10)

# create three data-frames in a list
# here you would for example, load the dataframes from your source into the list
df_list <- lapply(1:3, function(x) df)

str(df_list)
#> List of 3
#>  $ :'data.frame':    10 obs. of  2 variables:
#>   ..$ v1: int [1:10] 1 2 3 4 5 6 7 8 9 10
#>   ..$ v2: int [1:10] 1 2 3 4 5 6 7 8 9 10
#>  $ :'data.frame':    10 obs. of  2 variables:
#>   ..$ v1: int [1:10] 1 2 3 4 5 6 7 8 9 10
#>   ..$ v2: int [1:10] 1 2 3 4 5 6 7 8 9 10
#>  $ :'data.frame':    10 obs. of  2 variables:
#>   ..$ v1: int [1:10] 1 2 3 4 5 6 7 8 9 10
#>   ..$ v2: int [1:10] 1 2 3 4 5 6 7 8 9 10

# do some operations:
df_list2 <- lapply(df_list, function(d) {
  # do something
  d$v3 <- d$v1 + 100 * d$v2
  return(d)
})

df_list2
#> [[1]]
#>    v1 v2   v3
#> 1   1  1  101
#> 2   2  2  202
#> 3   3  3  303
#> 4   4  4  404
#> 5   5  5  505
#> 6   6  6  606
#> 7   7  7  707
#> 8   8  8  808
#> 9   9  9  909
#> 10 10 10 1010
#> 
#> [[2]]
#>    v1 v2   v3
#> 1   1  1  101
#> 2   2  2  202
#> 3   3  3  303
#> 4   4  4  404
#> 5   5  5  505
#> 6   6  6  606
#> 7   7  7  707
#> 8   8  8  808
#> 9   9  9  909
#> 10 10 10 1010
#> 
#> [[3]]
#>    v1 v2   v3
#> 1   1  1  101
#> 2   2  2  202
#> 3   3  3  303
#> 4   4  4  404
#> 5   5  5  505
#> 6   6  6  606
#> 7   7  7  707
#> 8   8  8  808
#> 9   9  9  909
#> 10 10 10 1010

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多