Последовательно переименовывайте элементы столбцов из выбранного вектора в R

#r

Вопрос:

Из файла с 230 строками весов (уникальные веса = 9) в R выбираются следующие веса:

5, 9, 7, 2, 8, 6, 2, 2, 2

Используя цикл for, пустую матрицу и входной файл, содержащий мой полный набор данных, эти веса создают следующий фрейм данных (полный выборка фрейма данных будет составлять ~230 строк).:

 WeightSample <- structure(list(Type = c("Apple", "Banana", "Apple", "Apple", 
"Banana", "Orange", "Pear", "Banana", "Pear", "Pear", "Banana", 
"Pear", "Pear"), Color = c("Red", "Yellow", "Red", "Red", "Yellow", 
"Orange", "Green", "Yellow", "Green", "Green", "Yellow", "Green", 
"Green"), Weight = c(5L, 5L, 5L, 9L, 9L, 7L, 2L, 8L, 6L, 2L, 2L, 2L, 2L)), 
class = "data.frame", row.names = c(NA, -13L))
 

Фрейм данных, который мне нужен:

 WeightSampleNeed <- structure(list(Type = c("Apple", "Banana", "Apple", "Apple", 
"Banana", "Orange", "Pear", "Banana", "Pear", "Pear", "Banana", 
"Pear", "Pear"), Color = c("Red", "Orange", "Yellow", 
"Red", "Green", "Green", "Red", "Yellow", "Red", "Green", "Red", "Orange", "Yellow"), 
Weight = c(1L, 1L, 1L, 2L, 2L, 3L, 4L, 5L, 6L, 7L, 7L, 8L, 9L)), 
class = "data.frame", row.names = c(NA, -13L))
 

Я пытался:

 library(data.table)
setDT(WeightSample)[, num := rleid(WeightSample$Weight)]
 

Поскольку этот код присваивает последовательный номер при изменении группы, он не выбирает 2, 2, 2 в конце моего вектора веса выборки, который вместо этого должен быть заполнен последовательными номерами (т. е. 7, 8 и 9) для каждой строки данных, связанной с весом в выбранном векторе. Я выбираю веса из своего полного набора данных 1000 раз, и, следовательно, количество строк будет меняться для каждого нового фрейма данных. Поэтому я сомневаюсь, что код, основанный на позиции, будет работать. Любая помощь будет признательна.

Комментарии:

1. Почему он не меняется для топ-5 5 5 или 9 9 и должен измениться только на 2 в конце

2. У вас есть какая-либо информация об уникальных значениях 5, 9, 7, 2, 8, 6, 2, 2, 2 , поскольку «Пример веса» не показывает эту информацию

3. Я понимаю эту часть, но как вы различаете 2, 2, 2 в конце? Я бы предложил иметь именованный вектор для отображения, потому что во входных данных неясно, как отличить 2 от другого

4. Может быть, в вашем исходном коде выборки это должен быть именованный вектор, т. Е. v1 <- setNames(c(5, 9, 7, 2, 8, 6, 2, 2, 2), seq_len(9)) , а затем вы возвращаете имя » v1 » вместо значения, чтобы получить ожидаемое

Ответ №1:

Возможно, в исходном коде мы изменим » Вес » на names «Фрукт.образец».

 for (i in 1:1000) {
 
   Fruit.sample <- sample(AllFruit$Weight, size = 9, 
          replace = TRUE) #create a sample based on weight of fruit
   # // set the names of Fruit.sample as the sequence of those values
   names(Fruit.sample) <- seq_along(Fruit.sample)
   WeightSample <- NULL

for (k in seq_along(Fruit.sample)) {

    tmp <- AllFruit[which(AllFruit$Weight == Fruit.sample[k]),]
    # // replace the 'Weight' with the corresponding `names` of Fruit.sample
    tmp$Weight <- names(Fruit.sample[k])
    WeightSample <- rbind(WeightSample, tmp)
    }
}