R - 在循环中使用子集和get()

时间:2014-10-06 11:35:27

标签: r loops dataframe

如果我有一个像这里的数据框列表 - 可重现的例子:

df1 <- data.frame(
    'Country' = sample(c("United States", "Canada"), 10, replace = TRUE),
    'Region' = sample(c("Unknown"), 10, replace = TRUE)
)
df2 <- data.frame(
    'Country' = sample(c("United States", "Canada"), 10, replace = TRUE),
    'Region' = sample(c("Unknown"), 10, replace = TRUE)
)
df3 <- data.frame(
    'Country' = sample(c("United States", "Canada"), 10, replace = TRUE),
    'Region' = sample(c("Unknown"), 10, replace = TRUE)
)

dflist <- c('df1', 'df2', 'df3')

当我循环通过下面的DF时,我得到子集行的错误。

for (i in unique(dflist)) {
  print(paste(i, nrow(get(i)), sep = ','))
  subset(get(i), site_country_code == 'United States')$Region <<- 'NA'
}

我明白了:

[1] "df1,10"

Error in subset(get(i), site_country_code == "United States")$Region <<- "North America" : 
  object 'i' not found

打印行似乎有效 - 返回df的名称和行数。然而,这个子集失败了这个&#39; i&#39;找不到错误。没有子集理解get(i)吗?有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

尝试

  lst1 <- lapply(mget(dflist), function(x) {
           x$Region <- as.character(x$Region)
           x$Region[x$Country == "United States"] <- "NA"
           x
         })

在上面的代码中,mget会在dflist中返回向量list的值。使用lapply处理列表。在为factor国家/地区Region分配character代码之前,已将RegionNA转换为United States类。然后使用list2env反映原始数据集中的更改。

  list2env(lst1, envir=.GlobalEnv)
  #<environment: R_GlobalEnv>

  head(df1,4)
  #      Country  Region
 #1        Canada Unknown
 #2        Canada Unknown
 #3        Canada Unknown
 #4 United States      NA

如果您不想将列更改为character,则可以在执行作业之前为NA创建Region级别。

 lst1 <- lapply(mget(dflist), function(x) {
      levels(x$Region) <- c(levels(x$Region), "NA")
      x$Region[x$Country == "United States"] <- "NA"
      x
    })

然后使用list2env