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))
我尝试使用 sapply
和 apply
来遵循您最初要求的方法,但挑战在于它试图将结果强制转换为矩阵。这要么强制将所有变量 return 编辑为字符,要么将 country
变量转换为数字并将 a
转换为 1
,b
为2
等等。
如果您更喜欢使用 apply
函数之一的单行代码,那么我建议使用 lapply
。 lapply
将 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
我正在尝试学习如何使用 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))
我尝试使用 sapply
和 apply
来遵循您最初要求的方法,但挑战在于它试图将结果强制转换为矩阵。这要么强制将所有变量 return 编辑为字符,要么将 country
变量转换为数字并将 a
转换为 1
,b
为2
等等。
如果您更喜欢使用 apply
函数之一的单行代码,那么我建议使用 lapply
。 lapply
将 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