在R中,如何从多年列中选择特定年份的数据?

时间:2013-08-12 19:33:33

标签: r

我有一个数据集,其中对于每一列,我想选择仅基于该观察年份的响应数据。我的数据集版本只有前四列;我想使用R语法创建第五列。在第五列,yr.response,我只想要与正确年份相对应的数据。我正在考虑ifelse()语句的一些迭代(例如,如果年份== 2000,然后从列y2000中选择等),但无法使其工作。我应该补充一点,实际数据集大约有30年和19K行,所以我希望能够实现自动化。

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 个答案:

答案 0 :(得分: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))]

答案 1 :(得分: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]
}

答案 2 :(得分: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

我仍然不确定y2001列中的98表示年份列为2000的含义,但此代码再现了您的示例yr.response列。

此示例假定您具有唯一列。换句话说,你不能有两个y2000列。

答案 3 :(得分:1)

以下是使用Map函数的解决方案,因此不需要R for loopmyrow<-as.list(df$year)#将年份转换为列表,以便输入Map

myout1<-Map(function(x) df[df$year==as.numeric(x),paste0("y",x)], myrow)# use to generate the output

#Convert到dataframe

myout2<-do.call(rbind,myout1)

#如果我们每年有多个观察年度栏目(这里每年最多两次观察),这里需要一个小技巧

myout2[which(!(myout2[,1]==myout2[,2])[1]==TRUE),2]<-myout2[which(!(myout2[,1]==myout2[,2])[1]==TRUE),1]

df$yr.response<-myout2[,2]


> df
  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