Пошаговая операция в течение для l oop с использованием dplyr - PullRequest
1 голос
/ 22 апреля 2020

У меня есть некоторые транспортные данные, которые я хотел бы выполнить по строкам, если сравнение в течение l oop. Данные выглядят примерно так.

# Using the iris dataset 
> iris <- as.data.frame(iris)
> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

Где результат будет записывать случаи длины чашелистика с равной шириной лепестка у каждого вида. Таким образом, мы записываем пары длины чашелистика с равной шириной лепестка (это только иллюстрация, не имеющая научного значения). Что приведет к чему-то вроде этого:

Species Petal.Width Sepal.Length1 Sepal.Length2
setosa          0.2         5.1             4.9
setosa          0.2         5.1             4.7
setosa          0.2         4.9             4.7
setosa          0.2         5.1             4.6
...

Моя первоначальная мысль Python -i sh заключалась в том, чтобы выполнить для l oop в пределах для l oop, выглядя примерно так:

for s in unique(Species):
  for i in 1:nrow(iris):
    for j in 1:nrow(iris):
      if iris$Petal.Width[i,] == iris$Petal.Width[j,]:
        Output$Species = iris$Species[i,]
        Output$Petal.Width = iris$Petal.Width[i,]
        Output$Sepal.Length1= iris$Sepal.Length[i,]
        Output$Sepal.Length2= iris$Sepal.Length[j,]
    end
  end
end

Я думал об использовании group_by для классификации Species первым, чтобы получить первое для l oop for s in unique(Species):. Но я не знаю, как последовательно сравнивать каждое наблюдение в наборе данных и сохранять его как второй блок кода. Я видел вопросы по для циклов в dplyr и по строкам . Приношу свои извинения, если код выше не так ясно. Первый раз задаю вопрос здесь.

1 Ответ

1 голос
/ 22 апреля 2020

Использование dplyr:

library(dplyr)    

iris %>%
      group_by(Species,Petal.Width) %>%
      mutate(n = n()) %>%
      filter(n > 1) %>%
      mutate(Sepal.Length1 = Sepal.Length,
             Sepal.Length2 = Sepal.Length1 - Petal.Width) %>%
      arrange(Petal.Width) %>%
      select(Species, Petal.Width, Sepal.Length1, Sepal.Length2)

Это группировка Species и Petal.Width, подсчет случаев, когда они совпадают, выбор только тех случаев, когда существует более 1 уникального спаривания, а затем переименование Sepal.Length в Sepal.Length1 и создание новой переменной Sepal.Length2 = Sepal.Length1 - Petal.Width

Для записи Sepal.Length для каждого Species в пределах определенного диапазона:

minpw <- min(Petal.Width)
maxpw <- max(Petal.Width)

iris %>%
  group_by(Sepal.Length, Species, petal_width_range = cut(Petal.Width, breaks = seq(minpw,maxpw,by=0.2))) %>%
  summarise(count = n())
...