оператор if / else в цикле for для R - требуется, чтобы оператор if включал несколько возможных значений - PullRequest
0 голосов
/ 29 февраля 2012

Я использую R и пытаюсь написать цикл for для анализа моих данных. Проблема, с которой я столкнулся, заключается в том, что некоторые из моих копий были отобраны 6 раз, а некоторые - 4 раза (я выращивал культуры, некоторые умерли после 4 временных точек, а другие жили в течение всего эксперимента и 6 раз). Я просто хочу установить условный цикл if / else внутри моего цикла for, чтобы отрезать значения NA (для точек, в которых эта культура не была выбрана). Вот что у меня есть:

names <- colnames(culture_data)
for(i in 1:72){
    n <- as.factor(names[i])
    chl.sub <- subset(culture_data, select = n)
    if (n == c("X1", "X2", "X3", "X10", "X11", "X12", "X37", "X38", "X39", "X46", "X47", "X48"))
        chl.sub <- as.matrix(chl.sub[1:4,])
        data <- (data.frame(time_newAgNP, chl.sub))
        }
    else {
        data <- (data.frame(time, chl.sub))
        }

Итак, я хочу, чтобы после строки 4 были подрезаны данные для культур 1-3, 10-12, 37-39 и 46-48, а для всех других культур были полностью использованы поднаборы данных.

Я думаю, что моя основная проблема заключается в первом утверждении «если» в том, что я не знаю, как сформулировать его, чтобы сказать R выполнить это условие, если n равно любому из этих значений.

Дайте мне знать, если что-то неясно. Спасибо!

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Если ваши данные выглядят так

       t1         t2          t3         t4         t5
1  1.00867689 -1.0286160 -0.13429176 -2.3891856  1.2285634
2 -0.06094606 -0.5265711 -0.52767898         NA         NA
3  1.60603566  0.8295580 -0.44729021 -0.1297540 -1.5007802
4  0.13809702  0.5940972  0.80628674         NA         NA
5  0.45239500  0.6797742 -0.03644485  0.7555041  0.4816549

, тогда

missing = subset(test,is.na(rowSums(test)))
nonmissing = subset(test,!is.na(rowSums(test)))

будет работать.

Хотя, как сказал Аарон, убедитесь, что отбрасывание этих данныхмудрый, прежде чем избавиться от него.категориальная переменная, идентифицирующая группы ранней смерти, могла бы работать.Хотя, возможно, есть лучшие способы справиться с этим.

Cheers, Davy

0 голосов
/ 01 марта 2012

Может быть просто на.омит? Он удалит неполные дела из вашего набора данных.

data <- na.omit(culture_data)
0 голосов
/ 01 марта 2012

Если вы пытаетесь создать 2 набора данных, один набор данных, содержащий только столбцы без отсутствующих наблюдений, и один набор данных, содержащий только столбцы, содержащие отсутствующие наблюдения, может что-то вроде этого будет работать:

a <- matrix(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,NA,NA,19,20,NA,NA,21,22), nrow=6, byrow=T)
a

zz <- which( !(is.na( colSums(a))) )

# columns without missing observations
b<- a[,zz]
b

# columns with missing observations
c<- a[1:4,-zz]
c

Здесьявляется циклом, который выбирает строки в столбце

for(i in 1:ncol(a)) {    if(is.na(sum(a[,i]) )) b = a[1:4,i] else b= a[1:6,i] ; print(b) }

Ни один из них не может работать, если в строках с 1 по 4 отсутствуют наблюдения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...