1

我有一些传输数据,如果在 for 循环中进行比较,我想按行执行。数据看起来像这样。

# 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-ish 想法是在 for 循环中执行 for 循环,看起来像这样:

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_byto classification Speciesfirst 来实现第一个 for 循环for s in unique(Species):。但我不知道如何逐行比较数据集中的每个观察值,并像第二个代码块一样存储它。我在 dplyr和rowwise quantity中看到了有关for 循环的问题。如果上面的代码不是很清楚,我很抱歉。第一次在这里提问。

4

1 回答 1

2

使用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.LengthSepal.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())
于 2020-04-22T13:34:41.050 回答