我试图根据另一个变量的字符值添加后缀字母。每当我在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
有什么建议吗?
答案 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