В R я хочу классифицировать каждую строку фрейма данных, разбивая значения по бинам и используя число (сумму) значений в каждом бине, чтобы назначить их в 2 группы (классы) с использованием логики if-else.
- В цикле R for я использовал команды R cut и split для сортировки значений по строкам.
- Бины (диапазоны): 1..9, 10 ..19, 20..29, 30..39, 40..49.
- Если строка содержит 1 пару значений, попадающих в один и тот же интервал (диапазон), скажем, 10..19, то это должно бытьклассифицируется как "P".Если он содержит 2 пары, попадающие в 2 разных бина (диапазона), то их следует классифицировать как «PP».
- Затем я создал 2 новые переменные с именами p и pp, используя жестко закодированные условия / правила.Значения в переменных - ИСТИНА или ЛОЖЬ, в зависимости от того, соответствует ли n-ая строка этим правилам.
- Наконец, я использовал p и pp в качестве условий в операторе if-else, чтобы присвоить каждой строке либокласс P (1-я строка) или класс PP (2-я строка).
Сначала я создал фрейм данных x:
n1 <- c(1, 7); n2 <- c(2, 11); n3 <- c(10, 14); n4 <- c(23, 32); n5 <- c(37, 37); n6 <- c(45, 41)
x <- data.frame(n1, n2, n3, n4, n5, n6)
x
n1 n2 n3 n4 n5 n6
1 1 2 10 23 37 45
2 7 11 14 32 37 41
1-ую строку следует классифицировать как "P ", потому что он имеет 1 пару значений (1, 2), попадающих в одну и ту же ячейку 1..10.
2-й ряд следует классифицировать как" PP ", поскольку он имеет 2 пары значений (11, 14и 32, 37), попадающие в 2 корзины: 10..19 и 30..39 соответственно.
Итак, после создания фрейма данных x я создал цикл for:
for(i in nrow(x)){
# binning the data:
bins <- split(as.numeric(x[i, ]), cut(as.numeric(x[i, ]), c(0, 9, 19, 29, 39, 49)))
# creating the rule for p (1 pair of numbers falling in the same range)
p <- (sum(lengths(bins) == 2) == 1 & sum(lengths(bins) == 1) == 4)
# creating the rule for pp (2 different pairs, each has 2 numbers falling in the same range)
pp <- (sum(lengths(bins) == 2) == 2 & sum(lengths(bins) == 1) == 2 & sum(lengths(bins) == 0) == 1)
if(p){
x$types <- "P"
} else if(pp){
x$types <- "PP"
} else{
stop("error")
}
}
print(x)
Я хочу создать новый столбец с именем types, содержащий класс P или PP:
n1 n2 n3 n4 n5 n6 types
1 1 2 10 23 37 45 P
2 7 11 14 32 37 41 PP
Вместо этого код вернул только PP:
n1 n2 n3 n4 n5 n6 types
1 1 2 10 23 37 45 PP
2 7 11 14 32 37 41 PP
Это потому, что цикл выполняется дважды над строками.Но если он запускается только один раз, все строки классифицируются как «P», а не «PP».Я ожидаю, что это что-то очень простое, просто не смог понять это до сих пор.