ifelse с выбором столбца и условием - PullRequest
0 голосов
/ 20 февраля 2019

Это мой первый вопрос здесь.Я делаю все возможное, чтобы сохранить его воспроизводимым.Я не могу найти вопрос, который решает эту проблему.

Пример данных

library(dplyr)

Data <- data.frame(
    a = sample(1:10),
    b = sample(c("T", "F"), 10, replace = TRUE),
    c = sample(1:10),
    x_a = sample(c("T", "F"), 10, replace = TRUE),
    x_b = sample(c("T", "F"), 10, replace = TRUE),
    y_a = sample(1:10),
    y_b = sample(1:10)
  )

Печать данных

    a b  c x_a x_b y_a y_b
1   3 T  3   F   T  10   8
2   5 F  7   T   F   8   9
3   2 T  9   F   T   6   4
4   8 F  5   T   F   4   7
5   6 F  6   T   F   5   1
6   9 F  2   T   F   1  10
7   4 F  8   T   F   7   5
8   7 F  1   T   T   2   2
9  10 F 10   T   F   3   3
10  1 F  4   F   T   9   6

Вот что я хочу сделать.Я хочу создать новый столбец, объединенный из следующей логики.

Data %>% mutate(new = ifelse(starts_with("x") & . == T,rowMeans(starts_with("y")),a))

В словах: Возьмите столбцы с шаблоном в его именах (начинается_с ("х"). Если одно (минимальное) значение в каждом наблюденииИстинно, взять строку из столбцов, названных другим шаблоном (start_with ("y")). Иначе (если в каждой строке есть только ложные значения), взять значение из столбца.

Пробовал несколько подходов сНоль успеха. Я потратил все утро на решение проблемы ... Есть идеи? Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

rowMeans не будет напрямую работать с «Starts_with», так как для расчета среднего значения потребуется диапазон столбцов.Следующее будет работать для вашего вышеупомянутого случая:

 Data <- Data %>% mutate(new = ifelse(x_a == 'T' | x_b == 'T',rowMeans(dplyr::select(.,starts_with("y"))),a))

Вы можете напрямую использовать 'select' вместо 'dplyr :: select', так как в моем случае есть проблема с версией!

0 голосов
/ 20 февраля 2019

Я думаю, что было бы лучше установить начальное значение на 1, чтобы данные можно было реплицировать.

set.seed(1)
Data <- data.frame(
  a = sample(1:10),
  b = sample(c("T", "F"), 10, replace = TRUE),
  c = sample(1:10),
  x_a = sample(c("T", "F"), 10, replace = TRUE),
  x_b = sample(c("T", "F"), 10, replace = TRUE),
  y_a = sample(1:10),
  y_b = sample(1:10)
)

Данные выглядят следующим образом:

> Data
    a b  c x_a x_b y_a y_b
1   3 T 10   T   F   5  10
2   4 T  2   F   F   8   3
3   5 F  6   T   F   4   4
4   7 T  1   T   F   2   9
5   2 F  9   F   F   1   8
6   8 T  8   F   F   6   2
7   9 F  7   F   T   7   5
8   6 F  5   T   T   9   7
9  10 T  3   F   F   3   1
10  1 F  4   T   F  10   6

Я решилПреобразуйте «T» или «F» в логическое значение «ИСТИНА» или «ЛОЖЬ» с помощью команды type.convert.

Data<-type.convert(Data)

Теперь вы можете использовать Grep, чтобы выбрать столбцы с «x».Применить суммы строк.Вы просто хотите, чтобы один из столбцов был ИСТИНА.Следовательно, до тех пор, пока сумма больше нуля, вы должны взять среднее значение столбцов, начинающихся с y:

Data$new<-ifelse(rowSums(Data[,grep("x",colnames(Data))])>0,rowMeans(Data[,grep("y",colnames(Data))]),Data$a)
> Data
    a     b  c   x_a   x_b y_a y_b  new
1   3  TRUE 10  TRUE FALSE   5  10  7.5
2   4  TRUE  2 FALSE FALSE   8   3  4.0
3   5 FALSE  6  TRUE FALSE   4   4  4.0
4   7  TRUE  1  TRUE FALSE   2   9  5.5
5   2 FALSE  9 FALSE FALSE   1   8  2.0
6   8  TRUE  8 FALSE FALSE   6   2  8.0
7   9 FALSE  7 FALSE  TRUE   7   5  6.0
8   6 FALSE  5  TRUE  TRUE   9   7  8.0
9  10  TRUE  3 FALSE FALSE   3   1 10.0
10  1 FALSE  4  TRUE FALSE  10   6  8.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...