对数据帧的每个值执行函数
问题描述:
我想对数据帧的每个元素执行一个函数。例如,我有一个数据帧df1与9个数字,我想要生成第二个数据帧df2,其中值为1,如果第一个数据帧中的同一索引上的数字是2,否则为0。对我来说似乎没问题 - 但我在应用函数中遇到问题 - 哪个函数在数据框的每个元素上执行函数?提前感谢!对数据帧的每个值执行函数
例如
# 1 2 3 0 1 0
# df1 <- 4 5 6 df2 <- 0 0 0
# 7 8 9 0 0 0
代码
a <- c(1, 2, 3)
b <- c(4, 5, 6)
c <- c(7, 8, 9)
df1 <- data.frame(a, b, c)
mf <- function(x) {
if (x == 2) {x <- 1}
else {x <- 0}
}
# something like:
df2 <- apply(df1, 1:3, mf(x))
答
,如果你想与apply
家庭功能专门去做了,你可以这样做:
data.frame(apply(df1,2,function(a) { sapply(a, mf) }))
# X1 X2 X3
#a 0 1 0
#b 0 0 0
#c 0 0 0
或者使用mapply
:
data.frame(matrix(mapply(mf,df1), nrow = 3))
鉴于功能mf
:
mf <- function(x) {
if (x == 2) return(1)
return(0)
}
数据
df1 <- structure(c(1, 4, 7, 2, 5, 8, 3, 6, 9), .Dim = c(3L, 3L), .Dimnames = list(
c("a", "b", "c"), NULL))
答
使用ifelse()
以执行上述条件
df <- data.frame(a=1:3,b=4:6,c=7:9)
df
# a b c
# 1 1 4 7
# 2 2 5 8
# 3 3 6 9
df1 <- data.frame(ifelse(df == 2, 1, 0))
df1
# a b c
# 1 0 0 0
# 2 1 0 0
# 3 0 0 0
答
一种选择是使用来自purrr
包的和simplify_all()
。
下面是一个例子,一个数据管道:
library(purrr)
d <- data.frame(a = 1:3, b = 4:6, c = 7:9)
mf <- function(x) {
if (x == 2) {x <- 1}
else {x <- 0}
}
d %>% map(map, mf) %>% simplify_all() %>% data.frame()
#> a b c
#> 1 0 0 0
#> 2 1 0 0
#> 3 0 0 0
也许并不理想,但d %>% map(map, mf)
正在执行的数据帧中的每个元素的功能,mf()
。这将返回列表的列表。其余部分 - %>% simplify_all() %>% data.frame()
- 将生成的列表清单转换回原始数据框架结构。
'df2 scoa