R - Выбор столбцов на основе условия - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь найти простой способ выбора различных столбцов (db$Item1, db$Item2, db$Item3, db$Item4) из набора данных на основе условия (db$Scale).Предпочтительно с помощью dplyr.Вот воспроизводимый пример.

Scale <- c(1, 1, 1, 2, 2, 3, 3)
Item1 <- c(4, 5, 4, 6, 7, 7, 6)
Item2 <- c(2, 3, 6, 3, 4, 5, 4)
Item3 <- c(6, 7, 3, 4, 5, 6, 5)
Item4 <- c(2, 5, 3, 5, 2, NA, NA)

db <- data.frame(Scale, Item1, Item2, Item3, Item4)

Краткое описание: у меня есть набор данных с тремя различными шкалами (1, 2 и 3), каждый из которых имеет разное количество элементов.Шкала 1 состоит из 4 элементов, шкала 2 состоит из 4 элементов, а шкала 3 состоит из 3 элементов.

#  Scale Item1 Item2 Item3 Item4
#1     1     4     2     6     2
#2     1     5     3     7     5
#3     1     4     6     3     3
#4     2     6     3     4     5
#5     2     7     4     5     2
#6     3     7     5     6    NA
#7     3     6     4     5    NA

Что мне нужно сделать, это создать новый набор данных (скажем: db.X), для которого у меня есть старый столбец Scale (новое имя: Scale.X), а затем новый столбец Item1.X, состоящий из значений под столбцом Item 1 для шкал 1 и 2и значения в столбце Item 3 для шкалы 3. Кроме того, я хочу сообщить значения для db$Item3 в новом столбце Item2.X

#  Scale.X Item1.X Item2.X
#1      1      4      6
#2      1      5      7
#3      1      4      3
#4      2      3      4
#5      2      4      5
#6      3      5      6
#7      3      4      5

Ответы [ 2 ]

1 голос
/ 21 марта 2019

с использованием data.table -

setDT(db)
db[,Item1.x:=ifelse(Scale == 1, Item1, Item2)]
setnames(db,c("Scale","Item3"),c("Scale.x","Item2.x"))
db <- db[,.(Scale.x,Item2.x,Item1.x)]

Выход-

> db
   Scale.x Item2.x Item1.x
1:       1       6       4
2:       1       7       5
3:       1       3       4
4:       2       4       3
5:       2       5       4
6:       3       6       5
7:       3       5       4
1 голос
/ 21 марта 2019

Это то, что вы ищете:

db %>%
  mutate(Scale.X = Scale) %>%
  mutate(Item1.X = ifelse(Scale == 1, Item1, Item2),
         Item2.X = Item3) %>%
  select(Scale.X, Item1.X, Item2.X)
  Scale.X Item1.X Item2.X
1       1       4       6
2       1       5       7
3       1       4       3
4       2       3       4
5       2       4       5
6       3       5       6
7       3       4       5
...