【问题标题】:R data transformation: create new rows based on numbers in different columnsR数据转换:根据不同列中的数字创建新行
【发布时间】:2021-11-02 21:04:54
【问题描述】:

我正在寻找如何使用 dplyr 转换以下数据框的解决方案:

item <- c('A','B','C')
one <- c(2, 1, 2)
two <- c(1,1,2)
data <- data.frame(item,one,two)
data
item one two
A 2 1
B 1 1
C 2 2

现在,“一”列包含值 1 的评分数,“二”列包含值 2 的评分数。转换后的理想数据框如下所示:

item rating
A 1
A 1
A 2
B 1
B 2
C 1
C 1
C 2
C 2

知道我怎样才能得到这个输出(它不一定是 dplyr)?我知道如何使用 tidyr 包的 pivot_longer 但这并不能解决重复行数的问题...

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    library(dplyr)
    library(tidyr) # pivot_longer
    nums <- c(one = 1, two = 2, three = 3)
    data %>%
      pivot_longer(-item) %>%
      group_by(item) %>%
      summarize(rating = rep(name, times = value)) %>%
      ungroup() %>%
      mutate(rating = nums[rating])
    # # A tibble: 9 x 2
    #   item  rating
    #   <chr>  <dbl>
    # 1 A          1
    # 2 A          1
    # 3 A          2
    # 4 B          1
    # 5 B          2
    # 6 C          1
    # 7 C          1
    # 8 C          2
    # 9 C          2
    

    我必须定义nums,因为我找不到(在我的匆忙中)以编程方式将"one" 转换为1 的简单方法。你需要确保它至少在你需要的时候熄灭;我添加了three=3 进行演示,如果您真的只有one 和two,那么您应该保持原样。

    (与该主题相关:Convert written number to number in R)

    【讨论】:

    • 这很漂亮,谢谢!
    【解决方案2】:

    也许您可以使用gather() 函数将其从宽格式转换为长格式,然后将“one”和“two”的字符串值替换为整数

    library(tidyverse)
    item <- c('A','B','C')
    one <- c(2, 1, 2)
    two <- c(1,1,2)
    data <- data.frame(item,one,two)
    long_df <- gather(data, rating, count, one:two)
    new_df <- tibble()
    
    for (i in range(nrow(data))) {
      new_df <- rbind(new_df, do.call("rbind", replicate(long_df[i, "count"], long_df, simplify = FALSE)))
    }
    
    new_df <- new_df %>% select(-c("count"))
    

    【讨论】:

    • (1) gather/spread 已被软性弃用,由pivot_longer/*_wider 取代,其预期用途更强大。 (2) 迭代地rbinding 到一个新框架的行在概念上是可行的,但扩展性很差,原则上不鼓励。请参阅The R Inferno,第 2 章“不断增长的对象”。
    • 谢谢,更新!
    猜你喜欢
    • 2019-04-17
    • 2018-04-17
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多