首页 > 解决方案 > 为什么在ave()中使用类整数的`==`的结果?

问题描述

这篇文章基于这个问题:Running ifelse statement by a variable

给定一些数据

  col1 col2
1    B   10
2    B    7
3    C    7
4    D    1
5    A    3
6    D    2

我们要向其中添加一个新列,该列指示“col2”的值是否是“col1”分组的“col2”的最大值。

base R一个可以使用transformave

transform(df, new_col = ave(col2, col1, FUN = function(x) x == max(x)))
  col1 col2 new_col
1    B   10       1
2    B    7       0
3    C    7       1
4    D    1       0
5    A    3       1
6    D    2       1

我的问题是为什么'new_col'是整数类型而不是逻辑?

@RichScriven 在评论中指出,这是因为 'col2' 已经是数字,但我不明白。

谢谢!

数据

df <- structure(list(col1 = c("B", "B", "C", "D", "A", "D"), col2 = c(10L, 
7L, 7L, 1L, 3L, 2L)), .Names = c("col1", "col2"), row.names = c(NA, 
-6L), class = "data.frame")

标签: rgrouping

解决方案


ave将返回同一类的对象,就x好像它可以被强制一样

with(df, ave(col2, col1, FUN = function(x) T))
# [1] 1 1 1 1 1 1
with(df, ave(col2, col1, FUN = function(x) 'a'))
# [1] "a" "a" "a" "a" "a" "a"

df$col2 <- as.logical(df$col2)
with(df, ave(col2, col1, FUN = function(x) T))
# [1] TRUE TRUE TRUE TRUE TRUE TRUE



df$col2 <- as.factor(df$col2)
with(df, ave(col2, col1, FUN = function(x) T))
# [1] TRUE TRUE TRUE TRUE TRUE TRUE
# Levels: TRUE

编辑:它似乎会强制进入“高级”类,而不是“低级”类。其中“更高”和“更低”由?c(下)中给出的顺序决定。

df$col2 <- as.logical(df$col2)
with(df, ave(col2, col1, FUN = function(x) 1))
# [1] 1 1 1 1 1 1

NULL <原始<逻辑<整数<双<复杂<字符<列表<表达式


推荐阅读