#r #apply #lapply
Вопрос:
Привет, у меня есть этот фрейм данных ( test
), и я хочу разделить каждый элемент в списке ( AO
) на значение в другом столбце ( DP
):
df <- structure(list(DP = c("572", "594", "625", "594", "537", "513"
), AO2 = list(list(c(2, 2)), list(c(2, 2, 2)), list(c(4, 4)),
list(c(3, 2, 2, 2, 3)), list(c(2, 2)), list(c(2, 2)))), row.names = c(NA,
-6L), class = c("data.table",
"data.frame"))
df
Я хотел бы создать новый столбец, в df
котором каждое значение списка делится на значение в df$DP
той же строке.
Я пробовал использовать mapply, но это не сработало. Есть идеи?
test$AO2_DP <- mapply(FUN = `/`, list(as.numeric(unlist(test$AO2))), as.numeric(test$DP), SIMPLIFY = FALSE)
Комментарии:
1. Пожалуйста, поделитесь образцом своих данных с
dput
Ответ №1:
Базовый вариант R с использованием Map
—
df$result <- Map(`/`, unlist(df$AO2, recursive = FALSE),df$DP)
df
# DP AO2 result
#1: 572 <list[1]> 0.003496503,0.003496503
#2: 594 <list[1]> 0.003367003,0.003367003,0.003367003
#3: 625 <list[1]> 0.0064,0.0064
#4: 594 <list[1]> 0.005050505,0.003367003,0.003367003,0.003367003,0.005050505
#5: 537 <list[1]> 0.003724395,0.003724395
#6: 513 <list[1]> 0.003898635,0.003898635
Если DP
значение в ваших реальных данных является символьным, сначала измените его на числовое df$DP <- as.numeric(df$DP)
, прежде чем применять ответ.
Ответ №2:
Поскольку столбец списков может быть вложенным, вы можете использовать rapply
его для перехода к каждому элементу и выполнения разделения.
df$AO2_DP <- Map(function(x, y) rapply(x, function(z) z/y, how="replace"),
df$AO2, as.numeric(df$DP))
df
# DP AO2 AO2_DP
#1 572 2, 2 0.003496503, 0.003496503
#2 594 2, 2, 2 0.003367003, 0.003367003, 0.003367003
#3 625 4, 4 0.0064, 0.0064
#4 594 3, 2, 2, 2, 3 0.005050505, 0.003367003, 0.003367003, 0.003367003, 0.005050505
#5 537 2, 2 0.003724395, 0.003724395
#6 513 2, 2 0.003898635, 0.003898635
Ответ №3:
Может rowwise
быть, и sapply
поможет
test %>%
rowwise() %>%
mutate(DP = as.numeric(DP)) %>%
mutate(AO2_DP = list(sapply(AO2, function(x) x/DP)))
Ответ №4:
Вот dplyr
решение, использующее вашу оригинальную идею, но измененное
library(dplyr)
df %>%
rowwise() %>%
mutate(AO2_DP = list(mapply(FUN = "/", list(as.numeric(unlist(AO2))), as.numeric(DP), SIMPLIFY = FALSE))) %>%
as.data.frame()
#> DP AO2
#> 1 572 2, 2
#> 2 594 2, 2, 2
#> 3 625 4, 4
#> 4 594 3, 2, 2, 2, 3
#> 5 537 2, 2
#> 6 513 2, 2
#> AO2_DP
#> 1 0.003496503, 0.003496503
#> 2 0.003367003, 0.003367003, 0.003367003
#> 3 0.0064, 0.0064
#> 4 0.005050505, 0.003367003, 0.003367003, 0.003367003, 0.005050505
#> 5 0.003724395, 0.003724395
#> 6 0.003898635, 0.003898635
Я добавил кавычку к FUN
вашему mapply()
, а затем для выполнения операции по строкам, которую я использую rowwise()
.
Ответ №5:
df %>%
unnest(AO2) %>%
mutate(DP = as.numeric(DP),
res = map2(.x = AO2, .y = DP, .f = ~ .x / .y))
Ответ №6:
Вы можете попробовать код ниже
transform(
df,
AO2_DP = Map("/", unlist(AO2, recursive = FALSE), as.numeric(DP))
)
что дает
DP AO2 AO2_DP
1: 572 <list[1]> 0.003496503,0.003496503
2: 594 <list[1]> 0.003367003,0.003367003,0.003367003
3: 625 <list[1]> 0.0064,0.0064
4: 594 <list[1]> 0.005050505,0.003367003,0.003367003,0.003367003,0.005050505
5: 537 <list[1]> 0.003724395,0.003724395
6: 513 <list[1]> 0.003898635,0.003898635