如何在 R 中循环遍历数据框?

10

假设有许多数据框需要执行相同的操作。例如:

prefix <- c("Mrs.","Mrs.","Mr","Dr.","Mrs.","Mr.","Mrs.","Ms","Ms","Mr")
measure <- rnorm(10)
df1 <- data.frame(prefix,measure)
df1$gender[df1$prefix=="Mrs."] <- "F"

当相邻行的值为 "Mrs." 时,将创建一个名为 gender 的指示变量。从此处中借鉴了一种在R中循环字符串变量的通用方法,并添加了函数as.name()来去除 "i" 中的引号:

dflist <- c("df1","df2","df3","df4","df5")

for (i in dflist) { 
  as.name(i)$gender[as.name(i)$prefix=="Ms."] <- "F"
  }

很遗憾,这不起作用。有什么建议吗?

2个回答

11

将所有数据框放入一个列表中,然后循环或使用lapply函数对它们进行操作。从长远来看,这会使你的工作更加轻松。

dfList <- list(df1=df1, df2=df2, ....)

dfList <- lapply(dfList, function(df) {
    df$gender[df$prefix == "Mrs."] <- "F"
    df
})

dfList$df1

谢谢,我该如何从dfList列表中提取新数据框? - hubert_farnsworth
使用 dfList[[1]] 等语句可以获取它们的名称。 - Hong Ooi

2
单个实例示例并不会真正创建通常意义上的指标,因为非 "F" 值将是 <NA>,这些值在 R 函数中无法很好地使用。算术运算和逻辑运算都将返回 . 请尝试以下内容:
  df1$gender <- ifelse(prefix %in% c("Mrs.", "Ms") , "probably F",
                ifelse( prefix=="Dr.", "possibly F",  # as is my wife.
                                       "probably not F"))

然后按照 @HongDoi 的建议使用列表。不要忘记 a) 返回完整的数据框对象,和 b) 将结果分配给一个对象名称(这两个都已经说明但常被 R-新手忘记)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接