1

各列について、その観測の年のみに基づいて応答データを選択したいデータセットがあります。私のバージョンのデータセットには、最初の 4 つの列しかありません。R 構文を使用して 5 番目の列を作成したいと考えています。5 番目の列 yr.response には、正しい年に対応するデータのみが必要です。ifelse() ステートメントの反復を検討しています (たとえば、年 ==2000 の場合、列 y2000 から選択するなど) が、機能しません。実際のデータセットには約 30 年と 19,000 行あるので、自動化できるようにしたいと付け加えておきます。

year<-c(2000,2000,2001,2002)
y2000<-c(65,43,42,74)
y2001<-c(98,93,987,948)
y2002<-c(875,983,776,736)
yr.response<-c(65,43,987,736)
x<-data.frame(cbind(year, y2000,y2001,y2002,yr.response))
4

4 に答える 4

2
my.df <- data.frame(year, y2000, y2001, y2002)
rownames(my.df) <- as.character(rownames(my.df))
my.df$yr.respnose <- my.df[cbind(rownames(my.df), paste0("y", my.df$year))]
于 2013-08-12T20:08:36.880 に答える
1

switch ステートメントと for ループを使用できます。

# Define a function to return which column the year refers to
col_finder <- function(r1) {
  switch(r1,
         "2000"=1,
         "2001"=2,
         "2002"=3) 
}

# Initiallize a new column
x$yr.response2 <- NA

# Switch statements are not vectorized, so run this in a for loop
for(i in 1:nrow(x)) {
  cmn <- col_finder(as.character(x[i, "year"]))
  x[i, "yr.response2"] <- x[i, cmn]
}
于 2013-08-12T19:54:24.977 に答える
1
year<-c(2000,2000,2001,2002)
y2000<-c(65,43,42,74)
y2001<-c(98,93,987,948)
y2002<-c(875,983,776,736)
yr.response<-NA
x<-data.frame(cbind(year, y2000,y2001,y2002,yr.response))

for(year in x[,"year"]){
  x$yr.response[which(x$year==year)] <- x[which(x$year==year),grep(year,colnames(x))]
}

与えます:

> x
  year y2000 y2001 y2002 yr.response
1 2000    65    98   875          65
2 2000    43    93   983          43
3 2001    42   987   776         987
4 2002    74   948   736         736

年が 2000 としてリストされている y2001 列で 98 が何を意味するのかはまだわかりませんが、このコードは yr.response 列の例を再現しています。

この例では、一意の列があることを前提としています。つまり、y2000 列を 2 つ持つことはできません。

于 2013-08-12T20:08:22.540 に答える