Добавление суффикса к значениям, отвечающим условию (ам) в R - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь добавить букву суффикса, основанную на символьном значении другой переменной. Всякий раз, когда я вижу «e» в переменной категории, тогда идентификатор должен иметь три строки, такие как i_C, i_E и i_O. Это означает, что у этого идентификатора есть три измерения C, E и O. Вот почему я хочу иметь три строки этого конкретного i.

Вот пример данных:

id <- c("i1","i2","i3","i4","i5")
category <- c("a", "b", "c", "d", "e")

data <- data.frame("id"=id, "category"=category)
  id category
1 i1        a
2 i2        b
3 i3        c
4 i4        d
5 i5        e

Я запустил этот код, но он мог выдавать только i1_A.

library(data.table)
setDT(data)
data[category == "e", id := paste0(id, "_", "A")]

> data
     id category
1:   i1        a
2:   i2        b
3:   i3        c
4:   i4        d
5: i5_A        e

То, что я хочу иметь:

> data
     id category
1:   i1        a
2:   i2        b
3:   i3        c
4:   i4        d
5: i5_A        e
6: i5_B        e
7: i5_C        e

Есть предложения?

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Я не совсем уверен, но вот что я думаю, что вы после:

library(data.table)

DT <- data.table(id = paste0("i", seq_len(5)), category = letters[seq_len(5)])
suffixTemplate <- data.table(suffix = paste0("_", LETTERS[seq_len(3)]), category = "e")

suffixDT <- DT[category == "e"][suffixTemplate, on = "category"]
suffixDT[, id := paste0(id, suffix)]
suffixDT[, suffix := NULL]

resultDT <- rbindlist(list(suffixDT, DT[category != "e"]), use.names = TRUE)

setorder(resultDT, id)
print(resultDT)

Результат:

     id category
1:   i1        a
2:   i2        b
3:   i3        c
4:   i4        d
5: i5_A        e
6: i5_B        e
7: i5_C        e
0 голосов
/ 19 июня 2019

Вот базовый подход R, который может быть воспроизведен в data.table (я не очень хорош в этом) -

library(magrittr)

apply(data, 1, function(x) {
  if(x[2] == "e") {
    cbind(paste(x[1], LETTERS[1:3], sep = "_"), "e")
  } else {
    x
  }
}) %>% 
{do.call(rbind, .)} %>% 
as.data.frame()

    id category
1   i1        a
2   i2        b
3   i3        c
4   i4        d
5 i5_A        e
6 i5_B        e
7 i5_C        e

ОБНОВЛЕНИЕ -

Вотпростой dplyr подход, который, безусловно, может быть воспроизведен в data.table -

df %>% 
  slice(rep(1:n(), 2*(category == "e") + 1)) %>% 
  group_by(category) %>% 
  mutate(
    id = paste0(id, "_"[any(category == "e")], LETTERS[row_number()][category == "e"])
  ) %>% 
  ungroup()

# A tibble: 7 x 2
  id    category
  <chr> <fct>   
1 i1    a       
2 i2    b       
3 i3    c       
4 i4    d       
5 i5_A  e       
6 i5_B  e       
7 i5_C  e 
...