【问题标题】:How do I loop through rows in a data frame in R in a specific order?如何以特定顺序遍历 R 中数据框中的行?
【发布时间】:2021-07-13 12:55:42
【问题描述】:

我想按照每行前 2 列值之和的顺序遍历以下数据框,然后为第三列值分配一个数字作为结果。

初始表:

Col 1 Col 2 Col 3
20 0
5 0
20 0
0 10
20 0
10 0
20 40
15 0

第 1 列和第 2 列的总和给出:

20+0=20

5+0=5

20+0=20

0+10=10

20+0=20

10+0=10

20+40=60

15+0=15

Col 1 Col 2 Col 3
20 0 10
5 0 20
20 0 10
0 10 20
20 0 10
10 0 20
20 40 5
15 0 20

3 个最低的和得到 Col 3 的值 20,接下来的 4 个最低的得到值 10,最高的得到 5。

【问题讨论】:

  • 如果您的数据集的行数多于或少于八行怎么办?
  • 如果你的 5 个最低的总和都等于 10.. 你如何处理平局?

标签: r loops


【解决方案1】:

这可以使用单个赋值而不是循环来完成,例如:

#Example data
df <- data.frame(col1 = c(20, 5, 20, 0, 21, 10, 20, 15), col2=c(0,0,0,10,0,0,40,0))

#Add dummy values
df$col3 <- NA

#Assign required values
df$col3[order(df$col1+df$col2)] <- rep(c(20,10,5), c(3,4,1))
df
#  col1 col2 col3
#1   20    0   10
#2    5    0   20
#3   20    0   10
#4    0   10   20
#5   21    0   10
#6   10    0   20
#7   20   40    5
#8   15    0   10

【讨论】:

    【解决方案2】:

    让我们以你给出的例子为例:

    df <- data.frame(Col1 = c(20,5,20,0,20,10,20,15),
                    Col2 = c(0,0,0,10,0,0,40,0))
    colnames(df) <- c("Col 1", "Col 2")
    

    然后我们可以这样做:

    library(dplyr)
    df <- df %>% 
      mutate(`Col 3` = `Col 1` + `Col 2`)
    
    col3_values <- sort(df$`Col 3`)
      
    
    df <- df  %>% 
      mutate(`Col 3` = case_when(`Col 3` <= col3_values[[3]] ~ 20,
                                 `Col 3` > col3_values[[3]] & `Col 3` <= col3_values[[7]] ~ 10,
                                 TRUE ~ 5))
    

    输出:

      Col 1 Col 2 Col 3
    1    20     0    10
    2     5     0    20
    3    20     0    10
    4     0    10    20
    5    20     0    10
    6    10     0    20
    7    20    40     5
    8    15     0    10
    

    请注意,最后一行不是您所期望的,因为总和不是最小的 3 个之一(您之前有一个 5 和两个 10)。

    但正如 Limey 评论的那样,如果您的行数超过 8 行,这将不起作用。您将不得不更改给定值受影响的范围

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 2018-12-31
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多