我正在尝试学习如何使用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中的变量。
答案 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)
我尝试使用sapply
和apply
来遵循您最初要求的方法,但是面临的挑战是它试图将结果强制转换为矩阵。这要么迫使所有变量返回为字符,要么将country
变量转换为数字,然后将a
转换为1
,将b
转换为2
等等。
如果您更喜欢使用apply
函数之一来编写一行代码,那么我建议使用lapply
。 lapply
将以列表形式返回结果,然后可以将其转换为数据框。解决方案如下:
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