выберите строку на основе значения другой строки в R

#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, а не как предопределенный индекс