#r #row
Вопрос:
РЕДАКТИРОВАТЬ: чтобы внести ясность, я знаю, как выбирать отдельные строки, и я знаю, что есть много разных способов сделать это. Я хочу написать код, который будет работать независимо от фактического значения строк, поэтому он работает с большим фреймом данных, то есть мне не нужно изменять код на основе содержимого. Поэтому вместо того, чтобы говорить, выберите строку 1, затем 3, он скажет: выберите строку 1, затем строку [значение в столбце 1 строки Z], затем строку [значение в столбце Z из только что выбранной строки] и так далее — поэтому мой вопрос в том, как сказать R, чтобы прочитать это значение как номер строки
Я пытаюсь понять, как выбрать и сохранить строку на основе значения в другой строке, чтобы получить новый df со строкой 1(aA), затем перейти к строке 3 и сохранить ее (cC), затем перейти к строке 2 и т. Д.
X Y Z
a A 3
b B 5
c C 2
d D 1
e E NA
Зная номер строки, я могу использовать rbind, который даст мне следующее
rbind(df[1, ], df[3, ]
a A 3
c C 2
Но я хочу, чтобы R извлек число 3 из столбца, чтобы явно не указывать ему, какую строку выбрать — как мне это сделать?
Спасибо
Ответ №1:
Вы можете использовать while
цикл, чтобы продолжать выбирать строки до NA
тех пор, пока в кадре данных не будут выбраны все или все строки.
all_rows <- 1
next_row <- df$Z[all_rows]
while(!is.na(next_row) || length(all_rows) >= nrow(df)) {
all_rows <- c(all_rows, next_row)
next_row <- df$Z[all_rows[length(all_rows)]]
}
result <- df[all_rows, ]
# X Y Z
#1 a A 3
#3 c C 2
#2 b B 5
#5 e E NA
Комментарии:
1. Еще раз привет, это хорошо работает с небольшим набором, но в файле большего размера он застревает в бесконечном запуске… не могли бы вы немного объяснить код, чтобы я мог понять, в чем дело? например, почему первое утверждение больше, чем nrow?
2. Это делается
length(all_rows) >= nrow(df)
для остановкиwhile
цикла, когдаNA
в данных его нет. Поэтому, еслиall_rows
включает все значения в столбце, то цикл останавливается.
Ответ №2:
если вы знаете, какие строки какого столбца вам нужны, вы можете использовать ;
df <- read.table(textConnection('X Y Z
a A 3
b B 5
c C 2
d D 1
e E NA'),
header=T)
desired_rows <- c('a','c')
df2 <- df[df$X %in% desired_rows,]
df2
выход;
X Y Z
<fct> <fct> <int>
1 a A 3
2 c C 2
Комментарии:
1. Я не знаю, в том-то и дело, что я пытаюсь узнать, как указать значение строки на основе значения в другой строке и столбце
2. вы можете применить метод, на который я ответил, звучит возможно
3. да, чтобы выбрать конкретную пару, но я хочу сказать «перейдите к номеру строки, указанному в столбце X», Затем в строке № 3 снова будет «перейдите к строке, указанной в столбце X», которая является строкой 2 и т. Д., В этом порядке.
4. Это не отвечает на вопрос, это просто базовое подмножество с известным индексом, OP хочет, чтобы индекс был извлечен из строки Z, а не как предопределенный индекс