我想在R中创建一个data.frame,其中一些列具有多个值(所有行的变量数相同).例如,这是一个包含两列(汽车和价格)的数据框,请注意列价格每行有三个值.
cars price
F 1000,2000,3000
GM 2000, 500, 1000
Run Code Online (Sandbox Code Playgroud)
第二个问题:
现在我想对price列中的每个值应用相同的函数,我该怎么做?假设我想创建另一个具有double值price列的列.
data.frames只是lists,因此,它们也可以list是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
Run Code Online (Sandbox Code Playgroud)
然后对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
Run Code Online (Sandbox Code Playgroud)
它得到了成功,通常有更好的方法来实现相同的目标.
另一种方法是简单地使用价格表作为数据集,并根据汽车列命名elemens:
names(price) <- cars
price
# $FORD
# [1] 1000 2000 3000
#
# $GM
# [1] 2000 500 1000
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您的*ply语句将具有已经分配给它们的汽车的名称,并且输入的次数会略微减少:
lapply(price, mean)
# $FORD
# [1] 2000
#
# $GM
# [1] 1166.667
Run Code Online (Sandbox Code Playgroud)
Al替代方法是使用long data.frame或data.table:
# transforming to long:
myDF <- data.frame("cars"=rep(cars, times=lapply(price, length)), "price"=unlist(price, use.names=FALSE))
myDF
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用by参数跨组中的所有价格执行函数:
by(data=myDF$price, INDICIES=myDF$cars, FUN=mean)
# or using with:
with(myDF, by(price, cars, mean))
Run Code Online (Sandbox Code Playgroud)
这是相同的方法,但使用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
Run Code Online (Sandbox Code Playgroud)