2015-03-20 3 views
2

Я новичок в R, и этот форум так извиняется за довольно фундаментальный вопрос.R: Найти определенное значение для каждой строки из поднабора столбцов

У меня есть группа столбцов (т.е. переменные, потому что это кадр данных), где все имена кодов начинаются с одного и того же имени, но заканчиваются на отдельное число, скажем: variable_0, variable_1 и т. Д. До 12.

Для каждого из этих столбцов каждая строка содержит числа, снова от нуля до двенадцати.

Я заинтересован в поиске (для каждой строки) значения, при котором тянущаяся номер ColName соответствует значение этой конкретной переменной:

v_0 v_1 v_2 v_3 
1 2 2 2 
1 2 3 3 

В этом примере, что я хотел бы иметь - новая переменная x, равная 2 для строки 1 (потому что v_i = i только для i = 2) и 3 для строки2.

В идеале, код также будет содержать решение для случая, когда существует несколько совпадений для каждой строки: создайте переменную y, которая равна единице, если число совпадений превышает одно и ноль в противном случае; установите x в первое совпадение.

Помощь очень ценится! Спасибо!

ответ

3

Попробуйте это:

trail = as.numeric(gsub(".*_([0-9]*)","\\1",names(df))) 
df$x = apply(df, 1, function(u) if(all(trail!=u)) NA else trail[match(T,trail==u)]) 

#> df 
# v_0 v_1 v_2 v_3 x 
#1 1 2 2 2 2 
#2 1 2 3 3 3 

Таким образом, если вы - в случае - дрянные данные, такие как:

df = data.frame(v_0=c(1,1,2), v_1=c(1,2,5), v_2=2:4, v_3=2:4) 
# v_0 v_1 v_2 v_3 
#1 1 1 2 2 
#2 1 2 3 3 
#3 2 5 4 4 

df$x = apply(df, 1, function(u) if(all(trail!=u)) NA else trail[match(T,trail==u)]) 
# v_0 v_1 v_2 v_3 x 
#1 1 1 2 2 1 
#2 1 2 3 3 3 
#3 2 5 4 4 NA 

trail содержит косое количество каждого столбца (я должен ключ разделитель _). Затем для каждой строки мы проверяем, какое число равно ее номеру пути в столбце (мы используем apply для цикла, второй аргумент 1 указывает, что мы перебираем строки - 2 для столбцов). Если нет совпадения, мы возвращаем NA. Если есть один или несколько, мы берем первое число.

+0

Хороший, но вы действительно должны объяснить, что каждая часть кода делает – nico

+0

Done с помощью примеров;) –

+0

Это очень полезно, спасибо. Просто для тех, кого это интересует, я немного изменил код, потому что на самом деле меня интересует только это для некоторого подмножества переменных: 'myvarlist <- paste (" var_ ", 0:12, sep =" ")' 'trail <- as.numeric (gsub (". * _ ([0-9] *) "," \\ 1 ", имена (df [myvarlist])))' 'df $ x <- apply (df, 1, function (u) if (all (trail! = u)) NA else trail [match (T, trail == u)]) ' – JBDonges

0

Другой вариант использования @ данных ColonelBeauvel является

trail <- as.numeric(sub('[^0-9]+', '', names(df))) 
indx <- df==trail[col(df)] 
df$x <- trail[max.col(indx, 'first')* NA^!rowSums(indx)] 
df 
# v_0 v_1 v_2 v_3 x 
#1 1 1 2 2 1 
#2 1 2 3 3 3 
#3 2 5 4 4 NA 
+0

Большое спасибо, это было действительно полезно! – JBDonges

Смежные вопросы