根据相同df

时间:2019-12-05 01:38:19

标签: python r dataframe

假设我有一个数据框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文件中。

1 个答案:

答案 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)))