2013-11-27 3 views
0

У меня есть 2 файла:R: сравнение с несколькими значениями

eg 
V1  V2 V3  V4  V5  V6  V7  V8 V9 
1 0.066 0.71125 1.77 0.5045 0.7417104 1.584007 0.872757 1.729945 4 
2 0.500 6.07500 20.30 1.7500 9.5017100 17.255490 11.180490 6.388851 4 
3 0.670 0.67000 0.67 0.6700 0.0000000 0.670000 0.670000 0.000000 1 

и

kl 
I II III IV  
1 0.80 0.60 0.40 0.20 
2 0.75 0.55 0.35 0.15 
3 65.60 50.70 38.80 24.00 

, которые я хотел сравнить все строки V2 из «например,» со всеми компетентно строк из «kl», «потому что мне нужно (в результате) оценить, какая строка получила класс (I, II, III, IV или V для остальных) в следующем столбце. .

if eg[1,2] >= kl[1,1] --> I 
if eg[1,2] >= kl[2,1] --> II 
if eg[1,2] >= kl[3,1] --> III 
if eg[1,2] >= kl[4,1] --> IV 
else --> V 

и то же самое, например, для [2,2] и, например, [3,2].

я починил свой первый цикл и итерации, как это, но (конечно) не работает ...:

eg <- read.csv("eg.csv", header=F, sep=";") 
eg <- eg[, -c(1,3,4,5,6,7,8,9)] 
eg <- t(eg) 
as.numeric(as.character(eg)) 

for (i in eg) { 
if (is.na(eg[i,1]) || eg[i,1] == "NA") { 
cat(("0"), sep=";") 
} else if (eg[i,1] >= kl[i,1]) { 
cat(("1"), sep=";") 
} else if (eg[i,1] >= kl[i,2]) { 
cat(("2"), sep=";") 
} else if (eg[i,1] >= kl[i,3]) { 
cat(("3"), sep=";") 
} else if (eg[i,1] >= kl[i,4]) { 
cat(("4"), sep=";") 
} else { 
cat(("5"), sep=";") 
next} 
} 

R возвращает хорошие значения только для двух первой линии, то он пишет:

00Error in if (is.na(eg[i, 1]) || eg[i, 1] == "NA") { : 
     missing value where TRUE/FALSE needed 

Но когда я делаю то же для каждой строки отдельно - это сработало. ТЕПЕРЬ НЕ :(

Пожалуйста, помогите мне И спасибо

+0

В вашем псевдокоде все условия '' ', а в вашем цикле некоторые из них' <'. Какой класс действителен, когда значение из' eg $ V2' соответствует нескольким классам из 'kl'? Кроме того, в вашем цикле' for', Я предполагаю, что это должно быть: 'for (i in 1: length (например, [, 2])) {'. –

ответ

1

Это гораздо более компактный способ:!

c("I", "II", "III", "IV") [ findInterval(eg[ , 1] , rev(kl[1, ])) ] 

Это использует функцию findInterval, чтобы определить, к какой категории (как число) каждый eg значение в. (The findInterval функция требует, чтобы они были не убывают, поэтому в этой проблеме мы должны rev() -erse граничных значений. это затем используется для выбора вектора символов.

Если вы публикуете пример, который имеет смысл (а не один с различным количеством элементов в строке), мы можем продемонстрировать, как положить в цикл или вызов sapply.

Шаг за шагом, который для R означает от самого внутреннего к внешнему:

1) Обратное упорядочение kl вектора так, что он может быть использован в качестве разрывов в findInterval

2) Проведите столбец eg[,1] через findInterval(.,.), указав индекс, который будет использоваться с «[»

3) Извлеките соответствующие элементы из символьного символа категории (в зависимости от интервала разрыва, значение которого, например, [, 1] ,

Код, указанный выше, был размещен, когда не было надлежащего примера. Часто необходимо поставить -Inf и Inf с обеих сторон точек останова, чтобы вы не получали нулевые индексы от findInterval. Это коды, кажется, работает на dataframes, предлагаемых в настоящее время:

apply(kl,1,function(x) c("V", "I", "II", "III", "IV") [ 
           findInterval(eg[ , 1] , c(-Inf, rev(x),Inf)) ] ) 
    1  2  3 
[1,] "V" "V" "V" 
[2,] "II" "II" "V" 
[3,] "III" "III" "V" 

, вероятно, хотите, чтобы перенести это из-за способа функция apply возвращает обработку строки в колонке заказа.

(я думаю спецификация проблема все еще перепутались, так как он относится к строке 4 объекта 3 строки (который также имеет 4 столбца. Числовые значения имеют смысл только при использовании в качестве строк.)

+0

Я исправил их в первом сообщении;) –

+0

Не могли бы вы объяснить этот код шаг за шагом? –

+0

Это выглядит очень хорошо, однако я хочу получить только одну колонку, только для 3 первых строк ... Мне нужно, например, [1,2] сравнить с kl [1,]; например, [2,2] для сравнения с kl [2,] и, например, [3,2] для сравнения с kl [3,] –

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