我有一个数据集,其中对于每一列,我想选择仅基于该观察年份的响应数据。我的数据集版本只有前四列;我想使用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))
答案 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 loop
。
myrow<-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