R:如何使用Apply循环遍历data.frame中的变量

时间:2018-07-10 04:05:43

标签: r loops dataframe apply sapply

我正在尝试学习如何使用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中的变量。

2 个答案:

答案 0 :(得分:1)

我将首先使用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))

答案 1 :(得分:1)

我尝试使用sapplyapply来遵循您最初要求的方法,但是面临的挑战是它试图将结果强制转换为矩阵。这要么迫使所有变量返回为字符,要么将country变量转换为数字,然后将a转换为1,将b转换为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