2013-08-12 1 views
1

У меня есть набор данных, в котором для каждого столбца я хочу выбрать опорную точку ответа, основанную только на году наблюдения. Моя версия набора данных имеет только первые четыре столбца; Я хочу создать пятый столбец, используя синтаксис R. В этой пятой колонке, yr.response, мне хотелось бы только привязку, соответствующую правильному году. Я рассматриваю некоторые итерации if ifelse() операторов (например, если год == 2000, затем выберите из столбца y2000 и т. Д.), Но не может заставить его работать. Я должен добавить, что фактический набор данных имеет около тридцати лет и 19 тыс. Строк, поэтому я хочу иметь возможность автоматизировать.В R, как выбрать привязку к конкретному году из нескольких столбцов года?

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

ответ

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))] 
+0

Уход. Я не знал, что вы можете выбирать элементы из фрейма данных с помощью матрицы. – dayne

1

Вы можете использовать оператор коммутатора и для цикла:

# 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] 
} 
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 

Я все еще не уверены относительно того, что 98 означает в y2001 столбец, где год указан как 2000, но этот код воспроизводит ваш столбец yr.response вашего примера.

В этом примере предполагается наличие уникальных столбцов. Другими словами, у вас не могло быть двух столбцов y2000.

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) 

#A небольшой трюк необходима здесь, если у нас есть более чем одно наблюдение за каждый год по году колонка (здесь два наблюдения с максимальным значением для каждого года)

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 
Смежные вопросы