尝试对数据框进行子集化,并一口气进行一些基本计算,以避免必须一遍又一遍地重复该函数。子集部分正在选择特定的列。基本的计算是各个列之间的简单比较。
以下是一些数据:
structure(list(name = structure(1:12, .Label = c("a",
"b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"), class = "factor"), data_2018 = c(4, 4, 4,
4, 3, 4, 2, 4, 3, 4, 4, 3),
data_2017 = c(1, 4, 4, 3, 2, 3, 3,
4, 2, 1, 1, 2),
pilot = c(2.68421052631579, 2.73684210526316,
3.52631578947368, 3.42105263157895, 3.05263157894737, 2.78947368421053,
2.21052631578947, 3.68421052631579, 2.36842105263158, 3.73684210526316,
2.47368421052632, 2.05263157894737),
all = c(2.77777777777778,
2.85185185185185, 3.62962962962963, 3.51851851851852, 3.18518518518519,
2.92592592592593, 2.2962962962963, 3.74074074074074, 2.40740740740741,
3.77777777777778, 2.55555555555556, 2.07407407407407),
general = c(2.79166666666667,
2.79166666666667, 3.58333333333333, 3.45833333333333, 3.08333333333333,
2.83333333333333, 2.41666666666667, 3.70833333333333, 2.54166666666667,
3.79166666666667, 2.54166666666667, 2.16666666666667),
tool = c("DoS",
"DoS", "DoS", "DoS", "DoS", "DoS", "DoS", "DoS", "DoS", "DoS",
"DoS", "DoS"), status = c(6, 8, 8, 6, 6, 6, 2, 8, 6, 6, 6, 6)), row.names = c(NA,
12L), class = "data.frame")
这是我尝试过的:
diffs <- select(agged
, agged$data_2018
, ifelse(agged$data_2018 >= agged$data_2017, 1, -1)
, ifelse(agged$data_2018 >= agged$pilot, 1, -1)
, ifelse(agged$data_2018 >= agged$all, 1, -1)
, ifelse(agged$data_2018 >= agged$general, 1, -1))
但这就是返回
错误每个参数必须产生正整数或负整数。
希望期望的输出类似于:
data_2018 | vs_data_2017 | vs_pilot | vs_all | vs_general
4 | 1 | 1 | -1 | 1
4 | 1 | 1 | -1 | 1
4 | -1 | 1 | 1 | 1
4 | -1 | -1 | 1 | 1
3 | 1 | -1 | 1 | 1
4 | -1 | 1 | 1 | -1
我尝试自己仅运行ifelse
部分,并且该部分返回正确整数的向量,所以我不确定还有什么尝试。有没有办法甚至没有dplyr
来做到这一点?希望没有该软件包就可以做到这一点。
答案 0 :(得分:1)
据我了解,这可能就是您想要的:
cbind(data_2018 = agged$data_2018, sapply(c("data_2017", "pilot", "all", "general"), function(c) (agged$data_2018 >= agged[[c]]) * 2 - 1))
您可以根据条件在要为-1或1的列上应用条件。布尔值TRUE或FALSE使用* 2-1从0/1转换为-1/1。
答案 1 :(得分:1)
require(dplyr)
agged %>%
mutate(vs_data_2017 = if_else(data_2018 >= data_2017, 1, -1),
vs_pilot = if_else(data_2018 >= pilot , 1, -1),
vs_all = if_else(data_2018 >= all , 1, -1),
vs_general = if_else(data_2018 >= general , 1, -1)) %>%
select(data_2018, vs_data_2017, vs_pilot, vs_all , vs_general)
答案 2 :(得分:1)
检查此解决方案:
library(dplyr)
agged %>%
select(data_2018, data_2017, pilot, all, general) %>%
mutate_at(2:5, funs(if_else(data_2018 >= ., 1, -1))) %>%
rename_at(2:5, funs(str_c('vs_', .)))
答案 3 :(得分:1)
根据您的描述,您可以直接使用比较符号(>=
)
(dd$data_2018 >= dd[3:6]) * 1
# data_2017 pilot all general
#1 1 1 1 1
#2 1 1 1 1
#3 1 1 1 1
#4 1 1 1 1
#5 1 0 0 0
#6 1 1 1 1
#7 0 0 0 0
#8 1 1 1 1
#9 1 1 1 1
#10 1 1 1 1
#11 1 1 1 1
#12 1 1 1 1
注意:我改为转换为0和1。您可以轻松地将其更改为1和-1