data.frame
s は単にs であるため、 s のslist
になることもあります。list
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
そうは言っても、私はこのアプローチに反対することをお勧めします。
扱いにくくなり、同じ目標を達成するためのより良い方法が通常あります。
別の方法の 1 つは、単純に価格表をデータセットとして使用し、cars 列に従って要素に名前を付けることです。
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
もう 1 つの方法は、long data.frame
orを使用すること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.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