Создание неравных последовательностей в R - PullRequest
0 голосов
/ 27 сентября 2019

Учитывая df=data.frame(x = seq(1:100), y = rnorm(100, mean=3, sd=0.5)) Я хотел бы создать новый вектор, чей i-й элемент определяется рассматриваемой строкой.Если это один из первых 3 элементов после подстановки данных в 5 поднаборов элементов, я бы хотел поставить «а», иначе «b».

Вывод будет выглядеть так:

1   2.6    a
2   3.5    a 
3   2.6    a
4   2.7    b
5   2.1    b
6   1.8    a
7   3.7    a
8   2.9    a
9   2.7    b
10  3.4    b

Единственная мысль, которая у меня возникла, заключается в том, что этот вопрос сводится к тому, как можно создать неравные последовательности, отсюда и название.Примерно так: если i-я строка является членом каждой последовательности, созданной ((5*j)-4):((5*j)-2), то назовите ее a, иначе b.Но как я мог создать вектор этих значений?Нечто подобное приведенному ниже, конечно, не будет работать, потому что каждый элемент в rows сам является последовательностью, а не всеми числами в последовательности.

>rows=vector()
>for (j in 1:(nrow(df)/5)) {
     rows[j]=((5*j)-4):((5*j)-2)
     }
>classify=vector()
>for (i in 1:(nrow(df))) {
  if (is.element(df[i,1], rows)) {
    classify[i]="a"
  } else {
    classify[i]="b"
  }
}
>df=cbind(df, classify)

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Если вы хотите определить, назначать ли 'a' или 'b' на основе того, является ли номер строки членом вывода какой-либо функции, вы можете поместить эту функцию в sapply и сгенерировать вывод.Затем вы можете создать новый столбец, используя ifelse и проверяя, является ли номер строки %in% выводом sapply.Здесь я sapply - над j, вектором индексов строк, но в зависимости от функции вам может потребоваться другой вектор для обеспечения генерации всех возможных выходов вашей функции в пределах 1:nrow(df).

j <- seq_len(nrow(df))
a_rows <- sapply(j, function(j) ((5*j)-4):((5*j)-2))

df$new <- ifelse(j %in% a_rows, 'a', 'b')
1 голос
/ 27 сентября 2019

Вы можете попробовать:

rep_len(c(rep("a", 3), rep("b", 2)), nrow(df))

      x        y z
1     1 3.467233 a
2     2 2.599982 a
3     3 3.941228 a
4     4 2.833142 b
5     5 4.070231 b
6     6 3.835760 a
7     7 3.688950 a
8     8 2.882646 a
9     9 3.071788 b
10   10 3.358480 b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...