R:如何使用 apply 循环 data.frame 中的变量

R: how to use apply to loop over variables in a data.frame

我正在尝试学习如何使用 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))

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

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

任何关于这个问题的见解或一般如何使用应用 and/or 其他方法在 data.frame 中循环变量的任何见解将不胜感激。

我会首先使用 is.numeric 查找数字列,然后仅将 1 添加到这些列。 sapply/lapply 遍历每一列,returns 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))

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

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

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