【问题标题】:How can R loop over data frames?R如何循环数据帧?
【发布时间】:2013-07-12 03:03:15
【问题描述】:

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

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"

当相邻行中的值为“夫人”时,将创建一个称为性别的指示变量。在 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"
  }

不幸的是,这不起作用。有什么建议?

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,如何从 dfList 列表中提取新的数据帧?
    • dfList[[1]] 等。我将编辑帖子以展示您如何使用名称将它们取出
    【解决方案2】:

    单实例示例不会真正创建通常意义上的指标,因为非“F”值将是&lt;NA&gt;,而这些值在 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 经常忘记。)

    【讨论】:

      猜你喜欢
      • 2013-05-05
      • 2019-11-12
      • 2019-07-29
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2021-11-22
      相关资源
      最近更新 更多