向满足R中条件的值添加后缀

时间:2019-06-18 19:39:13

标签: r data.table subset recode

我试图根据另一个变量的字符值添加后缀字母。每当我在category变量中看到“ e”时,该id就会包含三行,例如i_C,i_E和i_O。这意味着该id具有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 个答案:

答案 0 :(得分:1)

我不确定,但是我认为这是您追求的目标

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

答案 1 :(得分:0)

这是基本的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 
相关问题