【发布时间】:2016-10-16 04:35:32
【问题描述】:
这里是一个非常基本的编程问题,但为了将来,我只想知道哪种方式是处理这种常见情况的最佳方式。
我有 0 到 10 之间不同级别的三列,我希望确定其中哪一个具有最高的值,并显示列的名称(在变异列中或以其他方式创建的“最大”列中。)如果出现任何关系,我更喜欢 c 而不是 b 列,因为此开关将用于从其他列中提取值,这些值可能与这些列不同。
下面的代码可以解决问题,但有没有更短更简单的方法?
set.seed(7)
mat <- matrix(as.integer(runif(15, 0, 10)), nrow = 5, ncol = 3)
colnames(mat) <- letters[1:3]
(mat)
matBestOf <-
data.frame(mat) %>%
mutate(Largest = ifelse(c >= b & c >= a, "c",
ifelse(b >= c & b >= a, "b",
"a"))
)
matBestOf
# a b c Largest
# 1 9 7 1 a
# 2 3 3 2 b
# 3 1 9 7 b
# 4 0 1 0 b
# 5 2 4 4 c
我尝试使用max() 函数,但我只是让它返回最大值而不是具有最大值的列名。此外,我显然没有比较所有三列的值,因为结果仅来自 a 和 c 的最佳值,而从来没有 b时间>。此外,似乎我不能偏爱更高的字母,这没关系,也许我可以不用那个附加功能。
matBestOf <-
data.frame(mat) %>%
rowwise %>%
mutate(Largest = max(a:c))
matBestOf
# Source: local data frame [5 x 4]
# Groups: <by row>
#
# a b c Largest
# (int) (int) (int) (int)
# 1 9 7 1 9
# 2 3 3 2 3
# 3 1 9 7 7
# 4 0 1 0 0
# 5 2 4 4 4
【问题讨论】:
-
也许这会对你有所帮助。 stackoverflow.com/questions/10290801/…
-
您在解决方案中进行了几次不必要的测试,您只需要在代码中进行 3 次比较,并且只需执行 3 次中的 2 次。请参阅此处的示例 2:programiz.com/c-programming/examples/largest-number-three
-
太棒了!感谢您的反馈和有用的链接:我一直在寻找类似的东西。 [上面更新了代码。]
标签: r algorithm conditional dplyr