【问题标题】:R: how to use apply to loop over variables in a data.frameR:如何使用 apply 循环遍历 data.frame 中的变量
【发布时间】:2018-12-17 19:39:57
【问题描述】:

我正在尝试学习如何使用 apply(或 apply 系列的任何其他成员)来循环 data.frame 中的变量

例如:假设我有以下data.frame

    df_long <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3), 
             country=c('a','a','a','a','b','b','b','b','c','c','c','c'),
             year=c(1,2,3,4,1,2,3,4,1,2,3,4),
             amt = c(3,4,23,5,76,5,2,3,5,4,6,2))

我想遍历所有变量,如果变量是数字,那么我有一个,否则我什么也不做。我希望返回变量是一个 data.frame。 这是我到目前为止所拥有的,但它不起作用

    apply(df_long, 2, function(x) x = ifelse(is.numeric(x), x+1, x))

任何关于这个问题的见解或一般来说如何使用 apply 和/或其他方法遍历 data.frame 中的变量将不胜感激。

【问题讨论】:

标签: r loops dataframe apply sapply


【解决方案1】:

我尝试使用 sapplyapply 遵循您最初要求的方法,但挑战在于它试图将结果强制转换为矩阵。要么强制所有变量作为字符返回,要么将country 变量转换为数字,并将a 转换为1b 转换为2 等等。

如果您更喜欢使用apply 函数之一的单行代码,那么我建议使用lapplylapply 会将结果作为列表返回,然后可以将其转换为数据帧。解决方法如下:

as.data.frame(
  lapply(
    df_long, 
    function(col) 
      if(is.numeric(col)) {col + 1} else {col}))

结果是:

   id country year amt
1   2       a    2   4
2   2       a    3   5
3   2       a    4  24
4   2       a    5   6
5   3       b    2  77
6   3       b    3   6
7   3       b    4   3
8   3       b    5   4
9   4       c    2   6
10  4       c    3   5
11  4       c    4   7
12  4       c    5   3

【讨论】:

    【解决方案2】:

    我会首先使用is.numeric 查找数字列,然后仅将这些列加 1。 sapply/lapply 循环遍历每一列,如果列是否为数字,则返回 TRUE/FALSE。我们使用该逻辑索引 (col_ind) 对数据帧进行子集化并为其添加 1。

    col_ind <- sapply(df_long, is.numeric)
    df_long[col_ind] <- df_long[col_ind] + 1
    df_long
    
    #   id country year amt
    #1   2       a    2   4
    #2   2       a    3   5
    #3   2       a    4  24
    #4   2       a    5   6
    #5   3       b    2  77
    #6   3       b    3   6
    #7   3       b    4   3
    #8   3       b    5   4
    #9   4       c    2   6
    #10  4       c    3   5
    #11  4       c    4   7
    #12  4       c    5   3
    

    使用dplyr 可能是一种更简单的方法。

    library(dplyr)
    df_long %>%
      mutate_if(is.numeric, funs(. + 1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多