如果我有一个像这里的数据框列表 - 可重现的例子:
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)吗?有办法解决这个问题吗?
答案 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
代码之前,已将Region
列NA
转换为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