【问题标题】:column with multiple values in data.framedata.frame 中具有多个值的列
【发布时间】:2013-03-25 06:49:23
【问题描述】:

我想在 R 中创建一个 data.frame,其中一些列具有多个值(所有行的变量数量相同)。例如,这是一个包含两列(汽车和价格)的数据框,请注意每行的价格列具有三个值。

cars price

F    1000,2000,3000

GM   2000, 500, 1000

第二个问题:

现在我想对价格列中的每个值应用相同的函数,我该怎么做?假设我想创建另一个价格列值加倍的列。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    data.frames 只是 lists,因此,它们也可以是 lists 或 lists。

    cars <- c("FORD", "GM")
    price  <- list( c(1000, 2000, 3000),  c(2000, 500, 1000))
    myDF <- data.frame(cars=cars, price=cbind(price))
    
    myDF
    #    cars            price
    #  1 FORD 1000, 2000, 3000
    #  2   GM  2000, 500, 1000
    

    然后对给定行中price 的所有值执行函数:

    # execute on ALL PRICES at once
    mean(unlist(myDF$price))
    #  [1] 1583.333
    
    # execute on each set of PRICES per row: 
    lapply(myDF$price, mean)
    #  [[1]]
    #  [1] 2000 
    #    
    #  [[2]]
    #  [1] 1166.667
    

    话虽如此,我不推荐这种方法。

    它变得很麻烦,通常有更好的方法来实现相同的目标。

    另一种方法是简单地使用价格表作为您的数据集,并根据汽车列命名元素:

    names(price) <- cars
    price
    #  $FORD
    #  [1] 1000 2000 3000
    #    
    #  $GM
    #  [1] 2000  500 1000
    

    在这种情况下,您的 *ply 语句将具有已经分配给它们的汽车的名称,并且输入会稍微少一些:

    lapply(price, mean)
    #  $FORD
    #  [1] 2000
    #  
    #  $GM
    #  [1] 1166.667
    

    另一种方法是使用长 data.framedata.table

    # transforming to long: 
    myDF <- data.frame("cars"=rep(cars, times=lapply(price, length)), "price"=unlist(price, use.names=FALSE))
    myDF
    

    然后您可以使用 by 参数对组中的所有价格执行函数:

    by(data=myDF$price, INDICIES=myDF$cars, FUN=mean)
    
    # or using with:
    with(myDF, by(price, cars, mean))
    

    这是相同的方法,但使用data.table(内置by

    library(data.table)
    myDT <- data.table(myDF, key="cars")
    myDT[, mean(price), by=cars]
    
    #     cars       V1
    #  1: FORD 1501.250
    #  2:   GM 1166.667
    

    【讨论】:

    • @Sergey,没问题。请参阅有关替代方法的更新答案。
    • 非常感谢里卡多。我稍微简化了原始问题,如果我提供更多细节,您可能会提出更好的解决方案。就我而言,除了汽车名称 F 和 GM 之外,我还有其他属性(每列一个)。例如,“F, date_arrived, weight, price(3 个值和以前一样)”。但我仍然想将功能应用于价格列。您认为长 data.frame 或 data.table 仍然是最佳选择吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多