3

您好,我有这个数据框 ( 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)
4

6 回答 6

1

由于列表列可以嵌套,您可以使用它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
于 2021-09-08T10:10:17.977 回答
1

Base 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)然后再应用答案。

于 2021-09-08T02:03:57.097 回答
0

你可以试试下面的代码

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
于 2021-09-08T11:12:21.360 回答
0

也许rowwise并且sapply会有所帮助

test %>%
  rowwise() %>%
  mutate(DP = as.numeric(DP)) %>%
  mutate(AO2_DP = list(sapply(AO2, function(x) x/DP)))
于 2021-09-08T01:51:13.853 回答
0

这是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()

于 2021-09-08T01:53:27.010 回答
0
df %>%
  unnest(AO2) %>%
  mutate(DP = as.numeric(DP),
         res = map2(.x = AO2, .y = DP, .f = ~ .x / .y))
于 2021-09-08T09:30:48.540 回答