2016-07-25 284 views
-1

我想对数据帧的每个元素执行一个函数。例如,我有一个数据帧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)) 
+4

'df2 < - as.data.frame((df1 == 2)* 1)' – scoa

回答

0

,如果你想与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)) 
0

使用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 
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() - 将生成的列表清单转换回原始数据框架结构。

相关问题