我想按每行前两列值之和的顺序循环遍历以下数据帧,然后为第三列值分配一个数字。
初始表格:
Col 1 | Col 2 | Col 3 | |
---|---|---|---|
20 | |||
5 | 0 | ||
20 | |||
0 | 10 | ||
20 | |||
10 | |||
20 | 40 | ||
15 | 0 | //tr>
这可以使用单个赋值而不是循环来完成,例如:
#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
让我们以您给出的示例为例:
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行,这是行不通的。您必须更改给定值受影响的边界