【问题标题】:How to write a function where input is row of the dataframe and output is another dataframe?如何编写一个函数,其中输入是数据帧的行,输出是另一个数据帧?
【发布时间】:2020-05-12 18:30:30
【问题描述】:

我有一个包含 3 列、名称、开始和结束的表。我正在尝试编写(最好使用 tidyverse)函数,该函数将获取该表的每一行并根据逻辑创建(稍后绑定所有输出)数据帧。显然我需要 seq,但我不知道使用什么函数来处理输入。我尝试使用 map_df 和 rowwise 但没有运气。有任何想法吗?提前致谢!

这里是例子

输入

name|start|end
A   | 1   | 3
B   | 1   | 4

预期输出

Name|value
A   |1
A   |2
A   |3
B   |1
B   |2
B   |3
B   |4

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    我们可以使用map2

    library(dplyr)
    library(purrr)
    library(tidyr)
    df1 %>%
          transmute(name, value = map2(start, end, `:`)) %>%
          unnest(c(value))
    # A tibble: 7 x 2
    #  name  value
    #  <fct> <int>
    #1 A         1
    #2 A         2
    #3 A         3
    #4 B         1
    #5 B         2
    #6 B         3
    #7 B         4
    

    rowwise

    df1 %>%
       rowwise %>%
       transmute(name, value = list(start:end)) %>%
       unnest(c(value))
    

    或者在base R 中加上stackMap

    stack(setNames(do.call(Map, c(f = `:`, df1[-1])), df1$name))
    

    数据

    df1 <- data.frame(name = c('A', 'B'), start = c(1, 1), end = c(3, 4))
    

    【讨论】:

    • 这太棒了。正是我需要的。
    • 完成,需要再等几分钟才能接受。非常感谢!
    • unnest 中的c() 不是不必要的吗?只是测试自己。同意无论哪种方式都可以,但很好奇@akrun
    • @ChuckP 只是如果你有更多的列,它可以。包裹在c。我只是把它放在一个一般情况下,有时人们可能会返回一个查询 unnest(value1, value2) 不起作用
    猜你喜欢
    • 1970-01-01
    • 2016-12-04
    • 2019-07-15
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2021-05-08
    相关资源
    最近更新 更多