Выберите значения на основе других столбцов - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть фрейм данных (df, образец которого показан ниже).Я хочу выбрать значения из столбцов a1, b1 и c1 и взять среднее значение, если значения в a2, b2 и c2 положительные.Например, в первой строке df все значения в a2, b2 и c2 являются положительными, я затем выбираю соответствующие значения в a1, b1 и c1 и усредняю ​​их.Результат - 0,4933.Во втором столбце только значение в c2 является положительным, тогда я выберу значение в c1 (0,01).

a1       b1      c1      a2      b2      c2   desired outcome
0.51    0.49    0.48    0.05    0.03    0.09    0.493333
0.33    0.31    0.3    -0.03    -0.05   0.01    0.01
0.22    0.2     0.19    0.04    0.02    0.08    0.203333
0.54    0.52    0.51    -0.05   0.08    -0.01   0.08
0.45    0.43    0.42    -0.03   -0.05   0.01    0.01

Ниже приведен мой код, в котором я перечислил все сценарии.Я ищу более эффективные коды, которые могут обрабатывать больше столбцов.

df2 <- df1 %>% select(c(a2,b2,c2)) %>% 
  mutate(outcome = ifelse(a2 >0 & b2>0 & c2>0, mean(a1,b1,c1),
                          ifelse(a2>0 & b2>0 &c2<0, mean(a1,b1),
                                 ifelse(a2>0&b2<0&c2<0, mean(a1),
                                        ifelse(a2<0&b2>0&c2>0, mean(b2,c2),
                                               ifelse(a2<0&b2<0&c2>0, mean(c2),
                                                      mean(b2)))))))

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Поднабор - это просто выбор некоторого значения на основе некоторого условия, но это необязательно условие на основе самого этого значения.
Звучит сложно, но легко с примером:

 df[1,1:3][df[1,4:6]>0]

Мывозьмите из первой строки первые три столбца , но только те , для которых соответствующие значения равны TRUE.Основополагающие значения - это ответы на вопросы «положительны ли вы» для первого ряда, 4-6 столбцов.

Для этого первого ряда все три являются TRUE, но для 2-го мы получаем толькоодно значение: .3.И теперь мы можем просто взять среднее значение, и если мы хотим сделать это для всех строк, мы можем использовать sapply:

outcome <- sapply(1:nrow(df), function(i) {mean(df[i,1:3][df[i,4:6]>0])})

Только если есть строки, где a2, b2 и c2 все три отрицательны,тогда mean вернет NaN, для "Не число"

0 голосов
/ 10 декабря 2018

1) Здесь Mean выполняет расчет для одной строки, и мы применяем его к каждой строке отдельно.Здесь мы предполагаем, что вы хотите обнулить элементы в первых 3 столбцах, чей соответствующий столбец среди последних 3 столбцов является положительным, а затем взять среднее значение этого.

Mean <- function(x) mean(x[1:3] * (x[4:6] > 0))
transform(df2, desired = apply(df2, 1, Mean))

, давая:

    a1   b1   c1    a2    b2    c2   desired
1 0.51 0.49 0.48  0.05  0.03  0.09 0.4933333
2 0.33 0.31 0.30 -0.03 -0.05  0.01 0.1000000
3 0.22 0.20 0.19  0.04  0.02  0.08 0.2033333
4 0.54 0.52 0.51 -0.05  0.08 -0.01 0.1733333
5 0.45 0.43 0.42 -0.03 -0.05  0.01 0.1400000

2) или без apply:

transform(df2, desired = rowMeans(df2[1:3] * (df2[4:6] > 0)))

, дающий:

    a1   b1   c1    a2    b2    c2   desired
1 0.51 0.49 0.48  0.05  0.03  0.09 0.4933333
2 0.33 0.31 0.30 -0.03 -0.05  0.01 0.1000000
3 0.22 0.20 0.19  0.04  0.02  0.08 0.2033333
4 0.54 0.52 0.51 -0.05  0.08 -0.01 0.1733333
5 0.45 0.43 0.42 -0.03 -0.05  0.01 0.1400000

Примечание

Вход df2 в воспроизводимом видеФорма:

Lines <- "
a1       b1      c1      a2      b2      c2 
0.51    0.49    0.48    0.05    0.03    0.09
0.33    0.31    0.3    -0.03    -0.05   0.01
0.22    0.2     0.19    0.04    0.02    0.08
0.54    0.52    0.51    -0.05   0.08    -0.01
0.45    0.43    0.42    -0.03   -0.05   0.01"
df2 <- read.table(text = Lines, header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...