首页 > 解决方案 > R:如何使用 apply 循环遍历 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))

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

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

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

标签: rloopsdataframeapplysapply

解决方案


我会首先使用数字查找列,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))

推荐阅读