- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下数据框-
name amarks bmarks cmarks
1 A 25 30 40
2 B 45 78 50
3 C 75 72 29
4 D 18 16 70
. . . . .
其中 name 是人名,amarks、bmarks 和 cmarks 是此人在不同考试中的分数。现在我的任务是找出在 amarks、bmarks 和 cmarks 中得分最高的人的名字。我还必须将其存储为矢量。我已经通过以下方式解决了它 -
> max_name <- sapply(marks[,2:4], function(x) {subset(marks, x == max(x,
> na.rm = T), name)})
这给了我正确的答案,但是当我检查 max_name 的数据类型时,我看到它是一个列表,而理想情况下我希望 sapply 返回向量。
以下是我的观察——
class(max_name)
> list
typeof(max_name)
> list
is.vector(max_name)
> vector
有人可以解释一下这里发生的事情吗?我错过了什么吗?我是否需要对我的代码进行任何更改才能返回向量?
最佳答案
您的代码有一些问题:
subset
方法将 , drop = FALSE
设置为默认值,这意味着您将总是得到一个数据帧作为返回(除非您将明确指定 , drop = TRUE
)。因此,您将始终得到一个 list
向量作为结果,因为这是 R 中唯一可以将多个数据帧保存在一起的结构(另外,请注意 ?subset 中的“警告”部分
有关何时以及如果您应该使用它的文档)。x == max(...
可以返回未知数量的行,因为在每一列中可能有几个值等于最大值。因此,很可能你会得到不同的长度向量作为一个结果,好吧,只有一个 list
可以包含不同大小的向量。如果你只希望每列有一个结果,你可以使用 which.max
例如,也会自动忽略 NA
。让我们添加一些 NA
和一些等于列最大值的重复行,这样我们就可以看到结果有何不同
marks <- read.table(text = "name amarks bmarks cmarks
1 A NA 30 40
2 B 45 78 50
3 C 75 NA 70
4 D 75 16 70", header = TRUE, stringsAsFactors = FALSE)
marks
# name amarks bmarks cmarks
# 1 A NA 30 40
# 2 B 45 78 50
# 3 C 75 NA 70
# 4 D 75 16 70
基本上,如果您想要所有 name
,我们可以将unlist
添加到您的代码中
unlist(sapply(marks[, 2:4], function(x) {subset(marks, x == max(x, na.rm = TRUE), name)}))
# amarks.name1 amarks.name2 bmarks.name cmarks.name1 cmarks.name2
# "C" "D" "B" "C" "D"
不使用 subset
实现相同效果的替代方法
marks$name[unlist(sapply(marks[, 2:4], function(x) which(x == max(x, na.rm = TRUE))))]
## [1] "C" "D" "B" "C" "D"
甚至(矢量化/过于复杂的权衡)
marks$name[which(sapply(marks[, 2:4],
function(x) x == max(x, na.rm = TRUE)), arr.ind = TRUE)[, "row"]]
## [1] "C" "D" "B" "C" "D"
或者完全矢量化的解决方案(作为使用外部包、矩阵转换和通常 super 复杂的交换)
marks$name[which(marks[, 2:4] == matrixStats::colMaxs(as.matrix(marks[, 2:4]),
na.rm = TRUE)[col(marks[, 2:4])],
arr.ind = TRUE)[, "row"]]
## [1] "C" "D" "B" "C" "D"
不过,如果您只想要每列的第一个最大值,我们可以简化为(它也处理 NA
)
marks$name[sapply(marks[, 2:4], which.max)]
# [1] "C" "B" "C"
关于r - sapply() 返回列表而不是向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529668/
我是 R 的新手,正在尝试解决其中一个家庭作业问题。我正在练习使用的一组函数是 apply() 系列。具体来说,这道题要求使用 sapply() 函数来计算向量的均值。 稍微设置一下背景。首先,这是我
我有以下数据框- name amarks bmarks cmarks 1 A 25 30 40 2 B 45 78 50 3 C
我们是否有 sapply 的并行版本,因为我们在并行包中有 mclapply,它是 lapply 的一个版本。 最佳答案 正如@RHertel 指出的那样,snow包有应用系列选项,但它不计入 mcs
> system.time(sapply(rnorm(1000000,0,1), function (x) round(x,2))) user system elapsed 2.78
我想用 sapply 或其他应用函数复制一个嵌套循环。我有一个包含 100 只股票的月 yield 的数据集。我想计算每只股票的 t-6 到 t-2 月返回之和。这里 t 代表每个观察值。为此,我创建
我试图将数据集分成具有因子变量和非因子变量的部分。 我正在做类似的事情: 这部分工作: factorCols <- sapply(df1, is.factor) factorDf <- df1[,fa
我正在尝试开始摆脱 R 中的循环,但无法弄清楚如何返回有关 sapply 函数进度的信息。例如,如果我想处理一个向量并打印出我正在处理的行,请使用我编写的循环: vec = c(1:10) out =
我试图总结数据集中许多不同列(变量)的平均值、标准差等。我已经编写了自己的汇总函数来准确返回我需要的内容,并使用 sapply 立即将此函数应用于所有变量。它工作正常,但是返回的数据帧没有列名,我什至
我有一个关于 sapply 的问题在 R 中。在我的示例中,我将其用于留一法交叉验证 ##' Calculates the LOO CV score for given data and regre
我有一个数据集,它是使用 gdata 包中的 cbindX 函数通过列绑定(bind)创建的。此函数允许我绑定(bind)具有不同行数的列。因此,当特定列中没有值时,将引入 NA。现在,我想计算每列的
我有一个名为“d”的 ~1,300,000 行和 4 列的 data.frame 和另一个名为“gc”的 ~12,000 行和 2 列的 data.frame(但请参阅下面的较小示例)。 d sys
我有一个 data.frame 并且想要获取每一列的平均值。我申请了 sapply 并得到了以下 Hour Minute TotalDay TotalHour 0.00
对此的跟进 How to use `[[` and `$` as a function?问题:我开始玩一些原始设置(为简单起见,将大小从 10000 减小到 3) JSON NOSJ[[1]][[1
我想尝试一下模块化算法并编写了一些看似无辜的函数......但对以下意想不到的行为感到非常惊讶: crt crt(1:100, mods = c(5, 7)) [1] 1 2 3 4 0 6 2
我是 R 的新手,并试图用 apply 系列的函数替换一些 for 循环。 我仍然不完全理解它们是如何工作的,但我设法生成了一段工作代码: #create some input data tech t
我想替换数据框列中的缺失值。我写了以下代码 MedianImpute <- function(data=data) { for(i in 1:ncol(data))
这是我正在做的一个例子。 x <- c(a="2",b="4",c="2",d="9") df <- data.frame(names = c("d","c","a","b")) x 是一个命名的值向
我发现要将变量名转换为字符串,我会使用 deparse(substitute(x))哪里x是我的变量名。但是,如果我想在 sapply 函数调用中执行此操作怎么办? sapply( myDF, fun
我在 tmp 目录中有一个 .stat 文件列表。 样本: a.stat=> abc,10 abc,20 abc,30 b.stat=> xyz,10 xyz,30 xyz,70 等等 我需要找到所有
我有许多 Excel 文件,我将在将它们另存为 CSV 文件后将它们加载到 R 中。每个 Excel 文件都有几个采用货币格式的列。我可以手动或使用 VBA 调整 Excel 中的每一列,但我更喜欢在
我是一名优秀的程序员,十分优秀!