gpt4 book ai didi

r - 应用、数据框和 bool 值不能一起工作?

转载 作者:行者123 更新时间:2023-12-02 06:28:05 25 4
gpt4 key购买 nike

在下文中,逻辑运算符似乎无法正常工作。

a = c(TRUE, FALSE, TRUE, FALSE, TRUE, TRUE)
b = c('a', 'b', 'c', 'de', 'f', 'g')
c = c(1, 2, 3, 4, 5, 6)
d = c(0, 0, 0, 0, 0, 1)

wtf = data.frame(a, b, c, d)
wtf$huh = apply(wtf, 1, function(row) {
if (row['a'] == T) { return('we win') }
if (row['c'] < 5) { return('hooray') }
if (row['d'] == 1) { return('a thing') }
return('huh?')
})

制作:

> wtf
a b c d huh
1 TRUE a 1 0 hooray
2 FALSE b 2 0 hooray
3 TRUE c 3 0 hooray
4 FALSE de 4 0 hooray
5 TRUE f 5 0 huh?
6 TRUE g 6 1 a thing

天真地认为在第 1、3、5 和 6 行中会有we win

有人可以向我解释一下 (1) 为什么要这样做,(2) 如何解决这个问题以免发生这种情况,(3) 为什么我所有的逻辑列似乎都变成了字符,以及 (4)如何将函数类型安全地应用于数据框中的行?

最佳答案

为什么会这样?因为 apply 是为矩阵制作的。当你给它一个数据框时,首先发生的事情就是它被转换成一个矩阵:

m = as.matrix(wtf)
m
# a b huh huh1
# [1,] " TRUE" "a" "huh?" "hooray"
# [2,] "FALSE" "b" "huh?" "huh?"
# [3,] " TRUE" "c" "huh?" "hooray"
# [4,] "FALSE" "de" "huh?" "huh?"
# [5,] " TRUE" "f" "huh?" "hooray"
# [6,] " TRUE" "g" "huh?" "hooray"

发生这种情况时,您的不同数据类型将丢失,您的数据框式索引将不再起作用:

m['a']
# [1] NA

解决方案?使用简单的 for 循环:

wtf$huh1 = NA
for (i in 1:nrow(wtf)) {
wtf$huh1[i] = if(wtf[i, 'a']) "hooray" else "huh?"
}

如果你有一个函数 foo 那么

wtf$huh2 = NA
for (i in 1:nrow(wtf)) {
wtf$huh1[i] = foo(wtf[i, 'a'])
}

未矢量化的函数可以矢量化以避免循环的需要:

foov = Vectorize(foo)
# then you can
wtf$huh4 = foov(wtf$a)

关于r - 应用、数据框和 bool 值不能一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49908374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com