假设我有一个数据框df。 此df有3列:名称,D和R。
现在,R已经为每个名称填充了一个恒定值,但仅对应于D具有的最大值。 问题是,情况并非如此:变量R实际上取决于D的值,正如我所说,R的现有值仅对每个名称中D的最大数目正确。
我想根据每个名称的D 的值来减小R的值。更准确地说,每当D减少-200(这些都是mts,但这并不重要)时,R必须减少-0.1。这种功能关系适用于每个名称:根据名称的唯一相关事实是,每个名称都有其自己的R的“起点”。
Names D R
1 Group1 3290 1.4
2 Group2 3129 1.6
3 Group1 2920 1.4
4 Group4 1100 1.9
5 Group1 3500 1.4
6 Group1 3323 1.4
...
如您所见,即使D在变化,每个组的R值都是恒定的。假设3500是Group1的最高值。然后,我会期望像这样:
Names D R
1 Group1 3290 1.3
2 Group2 3129 1.6
3 Group1 2920 1.2
4 Group4 1100 1.9
5 Group1 3500 1.4
6 Group1 3323 1.4
...
我已经为此编码了一个解决方案:
library(dplyr)
df <- df %>% mutate(R = case_when(
(Names=="Group1" & D>=3500-100) ~ 1.4
(Names=="Group1" & D<3500-100) ~ 1.3
(Names=="Group1" & D<3500-200) ~ 1.2
...
(Names=="GroupN" & D>=#highest_value-100) ~ #default_value_of_R_for_GroupN
...
))
但这并不优雅。这就是为什么我尝试其他解决方案,例如:
library(sqldf)
list_Names <- sqldf("SELECT DISTINCT NAMES FROM df")
n<-1
while (n<30) {#here, 30 is arbitrary
decrement = n*200
for (r in df$R) {
for (n in list_names) {
if (df$names[r]==n & df$D<max(df$D) - decrem) {
r = (r - n*0.1)
}}}
n = n+1
}
但是那无处可去:/
我知道这里有一种简单得多的方法。任何帮助(R或Python)将不胜感激!!!
P.D:R的默认值不一定是最大值,我将它们保存在Excel文件中。
答案 0 :(得分:2)
我认为使用dplyr
,您可以做到
library(dplyr)
df %>% group_by(Names) %>% mutate(R1 = R - (0.1 * floor((max(D) - D)/200)))
# Names D R R1
# <fct> <int> <dbl> <dbl>
#1 Group1 3290 1.4 1.30
#2 Group2 3129 1.6 1.6
#3 Group1 2920 1.4 1.2
#4 Group4 1100 1.9 1.9
#5 Group1 3500 1.4 1.4
#6 Group1 3323 1.4 1.4
在基数R中应该是
df$R1 <- with(df, R - (0.1 * floor((ave(D, Names, FUN = max) - D)/200)))