2

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

cars price

F    1000,2000,3000

GM   2000, 500, 1000

第二个问题:

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

4

1 回答 1

7

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

另一种方法是使用 long data.frameor data.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.tableby内置)

library(data.table)
myDT <- data.table(myDF, key="cars")
myDT[, mean(price), by=cars]

#     cars       V1
#  1: FORD 1501.250
#  2:   GM 1166.667
于 2013-04-03T14:58:06.157 回答