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

标签 r

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

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/

相关文章:

r - 将辅助 x Axis 添加到 ggplot 线图,纯粹用于提供信息

r - 为嵌套列表的每个叶提取名称层次结构

r - ggplot2:箱线图是否仅用于计算位于 y 轴范围内的值?

R轴不显示

r - 是否有一个函数可以查找字符向量中的所有小写字母?

r - dplyr tidyeval 相当于下划线函数版本

r - 创建一个循环以在 ggplot 中写入注释

R 中的正则表达式查找

r - 如何将热图添加到 quantmod::chart_Series?

r - 使用 viridis 和 Map 值在直方图中着色