1

私はこのようなデータフレームを持っていますが、巨大なので手動で何もできません:

   Bank  Country  KeyItem    Year    Value 
    A      AU     Income     2010     1000
    A      AU     Income     2011     1130
    A      AU     Income     2012     1160
    B      USA    Depth      2010     10000

私がやりたいのは、銀行、キーアイテム、およびそれ以降の年を選択できる関数を作成することです。この関数は、最初の値のパーセンテージとして値を含むデータフレームを返します。このような:

   Bank  Country  KeyItem    Year    Value
    A      AU     Income     2010     100
    A      AU     Income     2011     113
    A      AU     Income     2012     116

前もって感謝します!

4

3 に答える 3

3

これは、高速でメモリ効率の高いdata.tableソリューションです。

DF <- read.table(text="Bank  Country  KeyItem    Year    Value 
A      AU     Income     2010     1000
A      AU     Income     2011     1130
A      AU     Income     2012     1160
B      USA    Depth      2010     10000", header=TRUE, stringsAsFactors=FALSE)

library(data.table)
DT <- as.data.table(DF)
setkey(DT, Bank, KeyItem, Year)

DT[J("A", "Income")] #all entries where Bank is "A", and KeyItem is "Income"
DT[J("A", "Income")][Year >= 2010] #only those with year >= your year

DT[J("A", "Income")][Year >= 2010, Value/Value[1]] # result as vector
DT[J("A", "Income")][Year >= 2010, list(Value/Value[1])] # result as data.table

> DT[J("A", "Income")][Year >= 2010, pct:=list(Value/Value[1])] #result as data.table with all columns
   Bank KeyItem Country Year Value  pct
1:    A  Income      AU 2010  1000 1.00
2:    A  Income      AU 2011  1130 1.13
3:    A  Income      AU 2012  1160 1.16
于 2012-11-05T18:41:18.703 に答える
2

次のアプローチを試してください:(dfはデータフレームです)

基準を選択します。

bank <- "A"
keyItem <- "Income"
year <- 2011

サブセットを作成します。

dat <- subset(df, Bank == bank & KeyItem == keyItem & Year >= year)

パーセンテージを計算します。

dat$Value <- dat$Value / dat$Value[1] * 100

関数として:

myfun <- function(df, bank, keyItem, year) {
   dat <- df[df$Bank == bank & df$KeyItem == keyItem & df$Year >= year, ]
   "[[<-"(dat, "Value", value = dat$Value / dat$Value[1] * 100)
}

myfun(df, "A", "Income", 2011)
于 2012-11-05T18:14:16.293 に答える
2

私はplyrそのようなタスクのためだけにパッケージを使用するようになりました:

library( "plyr" )

ddply( df, c("Bank", "KeyItem"), function(x) {
  base <- x[ min( x$Year ) == x$Year, "Value" ]
  x$Value <- 100 * x$Value / base
  return( x[ , c("Country", "Year", "Value") ] )
})
于 2012-11-05T18:11:10.750 に答える