r - 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 中的变量将不胜感激。
解决方案
我会首先使用数字查找列,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))
推荐阅读
- postgresql - Kubernetes:Postgres 容器不断重启
- testing - 是否可以直接集成 Wiremock (JSON) + Jira + Xray?
- android - 在启动应用程序之前,世博会发生奇怪的警告火灾
- rest - 带有发布者服务帐户的发布订阅休息 API
- rest - 415 通过邮递员的表单数据添加时不支持的媒体类型
- python-3.x - 有没有办法在 TFIDF 算法中将多列作为训练数据集?
- html - 使用 'card-deck' 类,顶部和底部的牌重合
- c++ - 联合或引用作为结构成员
- python-3.x - 如何使用 BeautifulSoup 从标签中提取文本
- python - 如何只执行一次 docker 健康检查?