向满足 R 中条件的值添加后缀
Adding suffix to values meeting a condition(s) in R
我正在尝试根据另一个变量的字符值添加后缀字母。每当我在类别变量中看到 "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
有什么建议吗?
我不完全确定,但我认为您想要的是:
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
这是一个基本的 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
我正在尝试根据另一个变量的字符值添加后缀字母。每当我在类别变量中看到 "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
有什么建议吗?
我不完全确定,但我认为您想要的是:
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
这是一个基本的 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