此帖子基于以下问题: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
中,可以使用transform
和ave
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")
答案 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 <原始<逻辑<整数<双<复数<字符<列表< 表达