【问题标题】:How to apply functions 'unite' and 'strsplit' or similar functions to a list of dataframes如何将函数“unite”和“strsplit”或类似函数应用于数据框列表
【发布时间】:2021-09-15 17:47:45
【问题描述】:

我是 R 新手,最近开始使用列表。

我有一个数据框列表,其中一个数据框看起来像这样:

pos <- c("chr1","chr1","chr1")
end <- c("205","206","207")
cpy <- c("4,4","3,3","4,4")
df1 <- as.data.frame(cbind(pos,end,cpy))

df1

   pos end cpy
1 chr1 205 4,4
2 chr1 206 3,3
3 chr1 207 4,4

我想做一些操作,将前两列组合起来,用“:”分隔,然后拆分第三列,只保留第一个元素。我找到了一种使用 tidyr 包中的 unitestrsplit 的简单方法:

library(tidyr)
df1 <- unite(df1, pos, sep=":", c("pos","end"))
df1$cpy <- sapply(strsplit(df1$cpy,","), `[`, 1)

df1
   pos     cpy
1 chr1:205   4
2 chr1:206   3
3 chr1:207   4

现在我想对列表中的所有数据框执行此操作。比如我想要这个

mylist
$df1
   pos end cpy
1 chr1 205 4,4
2 chr1 206 3,3
3 chr1 207 4,4

$df2
   pos end cpy
1 chr1 205 3,4
2 chr1 206 4,5
3 chr1 207 6,6

变成这样

mylist
$df1
       pos cpy
1 chr1:205   4
2 chr1:206   3
3 chr1:207   4

$df2
       pos cpy
1 chr1:205   3
2 chr1:206   4
3 chr1:207   6

正如我所说,我是 R 新手,甚至是列表新手。我正在尝试将lapplyunitestrsplit 一起使用,但它不起作用。是否可以在lapply(X, FUN, ...) 中使用任何类型的函数,或者我是否必须编写自己的函数以及如何轻松地做到这一点?或者如果你能推荐一些在线资料来帮助我学习解决这个问题的技巧,我也非常感激!

【问题讨论】:

    标签: r list dataframe lapply


    【解决方案1】:

    我们可以使用str_remove

    1. map循环list
    2. 通过在mutate 中使用str_remove 删除, 后跟一位或多位数字(\\d+) 来修改“cpy”列
    3. 通过分配给同一个对象来更新list(或者,如果我们想保留原始对象,则使用不同的对象)
    library(dplyr)
    library(purrr)
    library(stringr)
    lst1 <- map(lst1, ~ .x %>% 
            mutate(cpy = as.integer(str_remove(cpy, ",\\d+"))))
    

    -输出

    lst1
    $df1
       pos end cpy
    1 chr1 205   4
    2 chr1 206   3
    3 chr1 207   4
    
    $df2
       pos end cpy
    1 chr1 205   3
    2 chr1 206   4
    3 chr1 207   6
    

    数据

    lst1 <- list(df1 = structure(list(pos = c("chr1", "chr1", "chr1"), end = c("205", 
    "206", "207"), cpy = c("4,4", "3,3", "4,4")), class = "data.frame", row.names = c(NA, 
    -3L)), df2 = structure(list(pos = c("chr1", "chr1", "chr1"), 
        end = 205:207, cpy = c("3,4", "4,5", "6,6")), class = "data.frame", row.names = c("1", 
    "2", "3")))
    

    【讨论】:

    • 非常好!当列表中的数据框大小不同时,这是否也有效?
    • @MikedeGroot 是的,它不依赖于行大小,因为我们在“cpy”列上应用str_remove
    • 这太完美了,非常感谢!我也可以用map 解决我的第一个问题。
    • @MikedeGroot 也可以通过unite 解决,但我认为与此相比,这不是那么有效的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多