r - 为什么在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
一个可以使用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")
解决方案
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 <原始<逻辑<整数<双<复杂<字符<列表<表达式
推荐阅读
- angularjs - AngualrJs - 更改链接中 href 的值 -
- unity3d - Vuforia 插件统一消失
- javascript - 如何使用 azure 函数将 HTTP 查询参数插入 azure sql db
- docker - 在另一台主机上的 Netflix eureka 服务发现服务器中远程 dockerised spring boot 应用程序注册
- python - Python:如何删除 tkinter 图标
- node.js - 使用本地开发 npm 模块
- ruby - 拆分字符串时忽略空捕获
- c# - 在 IIS 服务器上部署站点在为 umbraco 休息服务保存样式表时抛出 404
- angular - 如何读取角度 5 中可观察的值以显示或隐藏错误消息
- javascript - Angular - 动态注入内容到
零件