R извлечь значение из столбца и строки в кадре данных - PullRequest
0 голосов
/ 21 марта 2019

У меня есть такой фрейм данных

#dt
#   one two row MAX_row three four
#1: a   1   0   2       yes   yes
#2: a   2   2   2       yes   yes
#3: a   3   0   2       no    yes
#4: b   1   0   5       yes   no
#5: b   2   5   5       no    no
#6: b   3   0   5       no    no

для создания переменных строки и MAX_row я произвел код следующим образом:

dt$row <-ifelse(dt$two == 2,rownames(dt), 0)
dt <- dt %>% group_by(one) %>% mutate(MAX_row=max(row))

и сейчас я пытаюсь заполнить четвертый столбец значениями из третьего столбца. Номера строк указаны в столбце MAX_row. Итак, в четвертом столбце для строки с «a» в столбце 1 должны быть значения из строки № 2 в третьем столбце, как я показал в dt. Я думал, что следующий код будет в порядке, но он выдает странные значения:

dt$four <- ifelse(dt$one=='a',dt$three[dt$MAX_row],0)

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Лучше всего не смешивать синтаксис data.table и dplyr.Поскольку dt выглядит как data.table, вот решение data.table

dt[
    , row := ifelse(two == 2, .I, 0)][,
    , MAX_row := max(row), by = one][,
    , four := ifelse(one == "a", three[MAX_row], 0)]
#   one two row MAX_row three four
#1:   a   1   0       2   yes  yes
#2:   a   2   2       2   yes  yes
#3:   a   3   0       2    no  yes
#4:   b   1   0       5   yes   no
#5:   b   2   5       5    no   no
#6:   b   3   0       5    no   no

Или все за один шаг, избегая генерации row и MAX_row (как выделено Ронаком)

dt[, four := three[which.max(two == 2)], by = one]
#   one two row MAX_row three four
#1:   a   1   0       2   yes  yes
#2:   a   2   2       2   yes  yes
#3:   a   3   0       2    no  yes
#4:   b   1   0       5   yes   no
#5:   b   2   5       5    no   no
#6:   b   3   0       5    no   no
0 голосов
/ 21 марта 2019

Если я правильно понимаю, вы начинаете с трех столбцов one, two и three, и я думаю, row и MAX_row - это временные переменные, созданные для достижения до four.

Мы можем получить ожидаемый результат без необходимости создавать эти переменные.

library(dplyr)

df %>%
  group_by(one) %>%
  mutate(four = three[which.max(two == 2)])

#  one     two three four 
#  <fct> <int> <fct> <fct>
#1  a         1 yes   yes  
#2  a         2 yes   yes  
#3  a         3 no    yes  
#4  b         1 yes   no   
#5  b         2 no    no   
#6  b         3 no    no   

Это все еще дает ожидаемый результат без создания row и MAX_row.

данные

df <- structure(list(one = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label 
 = c("a", 
"b"), class = "factor"), two = c(1L, 2L, 3L, 1L, 2L, 3L), three = 
structure(c(2L, 
2L, 1L, 2L, 1L, 1L), .Label = c("no", "yes"), class = "factor")), 
row.names = c("1:", 
"2:", "3:", "4:", "5:", "6:"), class = "data.frame")
...