2

R で data.frame を作成し、いくつかの列に複数の値 (すべての行で同じ数の変数) を持たせたいと考えています。たとえば、これは 2 つの列 (車と価格) を持つデータ フレームです。列の価格には、各行に 3 つの値があることに注意してください。

cars price

F    1000,2000,3000

GM   2000, 500, 1000

2 番目の質問:

同じ関数を価格列の各値に適用したいのですが、どうすればよいですか? 価格列の値が2倍になった別の列を作成したいとしましょう。

4

1 に答える 1

7

data.frames は単にs であるため、 s のslistになることもあります。listlist

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.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 に答える