为什么在ave()中使用类整数的“ ==”结果?

时间:2018-06-22 15:43:19

标签: r grouping

此帖子基于以下问题: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")

1 个答案:

答案 0 :(得分:4)

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 <原始<逻辑<整数<双<复数<字符<列表<   表达