【问题标题】:R transform data with multiple valuesR变换具有多个值的数据
【发布时间】:2016-09-29 19:53:48
【问题描述】:

我正在尝试转换我的数据,以便每个关键字都有一个值,而不是按值分组。我的数据目前是这样组织的:

df:

score1 score2 keyword1 keyword2 keyword3
.2    .4    brown    fox    jump
.7    .2    hello    bye    
.1    .9    foo        

我希望我的数据如下所示:

keyword score1 score2
brown    .2    .4     
fox    .2    .4    
jump    .2    .4    
hello    .7    .2    
bye    .7    .2   
foo    .1    .9  

数据:

df = structure(list(score1 = c(.2, .7, .1), score2 = c(.4, .2, .9), keyword1 = c("brown", "hello", "foo"), keyword2 = c("fox", "bye"), keyword3 = "jump"), .Names = c("score1", "score2", "keyword1", "keyword2", "keyword3"), row.names = c(NA, -5L), class = "data.frame")

有什么建议吗?

【问题讨论】:

    标签: r transform


    【解决方案1】:

    这是使用data.table 包中的melt 的一种方法:

    # drop some missing obs
    df <- df[1:3, ]
    # create ID variable
    df$id <- 1:nrow(df)
    
    # load data.table
    library(data.table)
    # reshape long (melt)
    newdf <- melt(df, id.vars=c("id", "score1", "score2"), 
         measure.vars=c("keyword1", "keyword2", "keyword3"), value.name="keyword")
    

    虽然在示例中不是必需的,但我添加了一个 id 变量,以便此方法适用于更大的数据集,以涵盖 score1 和 score2 对于多个观察可能相同的情况。这会比您的示例多创建两列,即 id 列和带有“keyword1”的列,依此类推。删除这些很容易。此外,存在一些不适用的行,对输入数据的非矩形形状有影响。这些可以通过is.na 删除:

    # drop rows with missing values in keyword column
    newdf <- newdf[!is.na(newdf$keyword),]
    

    【讨论】:

    • 我喜欢你的回答,我有一个问题。我已经忙于 R 将近一年了,但我没有看到任何进展。你是如何使用 R 的?
    • 很多小时,很多年:进展可能很慢。最重要的是:花额外的时间分解工作代码,看看每个部分的作用。阅读您不理解的功能的帮助文件。了解对象类型以及特定函数需要哪些对象类型。
    【解决方案2】:

    使用来自tidyrgather() 的另一种选择:

    library(tidyr)
    
    df %>%
      gather(label, keyword, -(score1:score2), na.rm = TRUE) 
    

    这给出了:

    #   score1 score2    label keyword
    #1     0.2    0.4 keyword1   brown
    #2     0.7    0.2 keyword1   hello
    #3     0.1    0.9 keyword1     foo
    #6     0.2    0.4 keyword2     fox
    #7     0.7    0.2 keyword2     bye
    #11    0.2    0.4 keyword3    jump
    

    或者,您可以通过将select(-label) 添加到链中来删除label 列。


    数据

    df <- structure(list(score1 = c(0.2, 0.7, 0.1, NA, NA), score2 = c(0.4, 
    0.2, 0.9, NA, NA), keyword1 = c("brown", "hello", "foo", NA, 
    NA), keyword2 = c("fox", "bye", NA, NA, NA), keyword3 = c("jump", 
    NA, NA, NA, NA)), .Names = c("score1", "score2", "keyword1", 
    "keyword2", "keyword3"), row.names = c(NA, -5L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-19
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多