data.frame中具有多个值的列

时间:2013-04-03 14:27:53

标签: r dataframe

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

cars price

F    1000,2000,3000

GM   2000, 500, 1000

第二个问题:

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

1 个答案:

答案 0 :(得分:7)

data.frame只是list s,因此,它们也可以是list的{​​{1}} s。

list

然后对给定行中的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

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

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

替代方法是使用长lapply(price, mean) # $FORD # [1] 2000 # # $GM # [1] 1166.667 data.frame

data.table

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

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

这是相同的方法,但使用by(data=myDF$price, INDICIES=myDF$cars, FUN=mean) # or using with: with(myDF, by(price, cars, mean)) (内置data.table

by