R如何循环数据帧?

时间:2013-07-13 20:45:17

标签: r for-loop

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

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中循环字符串变量的一般方法是从here改编而添加函数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 个答案:

答案 0 :(得分:10)

将所有数据框放入列表中,然后循环/ lapply。从长远来看,这对你来说会容易得多。

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

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

dfList$df1

答案 1 :(得分: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)返回一个完整的dataframe-object,并且b)将结果分配给一个对象名称(两者都被说明但经常被R-newbs遗忘。)