子集数据帧并一次运行计算

时间:2019-01-29 14:06:51

标签: r

尝试对数据框进行子集化,并一口气进行一些基本计算,以避免必须一遍又一遍地重复该函数。子集部分正在选择特定的列。基本的计算是各个列之间的简单比较。

以下是一些数据:

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来做到这一点?希望没有该软件包就可以做到这一点。

4 个答案:

答案 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