r - ifelse dplyr 显示错误的输出

标签 r if-statement dplyr

我想创建一个新列,它选择三个可能列中的最小值,然后根据条件使用addsubtract

我有下一个数据框,名为df:

     a    b    c
1  0.60 0.27 0.14
2  0.48 0.32 0.21
3  0.42 0.24 0.35
4  0.28 0.33 0.41
5  0.52 0.28 0.22
6  0.34 0.30 0.37
7  0.38 0.28 0.35
8  0.34 0.28 0.40
9  0.53 0.26 0.22
10 0.17 0.27 0.58
11 0.34 0.35 0.33
12 0.19 0.27 0.56
13 0.56 0.29 0.17
14 0.55 0.28 0.19
15 0.29 0.24 0.48
16 0.23 0.31 0.47
17 0.40 0.32 0.28
18 0.50 0.27 0.24
19 0.45 0.28 0.27
20 0.68 0.26 0.05
21 0.40 0.32 0.28
22 0.23 0.26 0.50
23 0.46 0.33 0.20
24 0.46 0.24 0.28
25 0.44 0.24 0.31
26 0.46 0.26 0.27
27 0.30 0.29 0.40
28 0.45 0.20 0.34
29 0.53 0.27 0.20
30 0.33 0.34 0.33
31 0.20 0.26 0.55
32 0.65 0.29 0.06
33 0.45 0.24 0.32
34 0.30 0.26 0.45
35 0.20 0.36 0.45
36 0.38 0.16 0.38

每一行的总和必须为 1,但正如您所注意到的,只有其中一些满足该条件。

df_total <- rowSums(df[c("a", "b", "c")])
print(df_total)
   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19 
1.01 1.01 1.01 1.02 1.02 1.01 1.01 1.02 1.01 1.02 1.02 1.02 1.02 1.02 1.01 1.01 1.00 1.01 1.00 
  20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36 
0.99 1.00 0.99 0.99 0.98 0.99 0.99 0.99 0.99 1.00 1.00 1.01 1.00 1.01 1.01 1.01 0.92

例如,在 df 的第 36 行中,我需要将最低值(即 0.16)与一个数字相加,该数字将使 a, bc 之和为 1。

我想有一种更简单的方法可以做到这一点,但到目前为止我已经完成了这段代码,但它不起作用......为什么?

df_total <- rowSums(df[c("a", "b", "c")])

df_for_sum <- df_total[df_total > 1] - 1  #The ones which are above 1
df_for_minus <- -(df_total[df_total < 1]) + 1  #The ones which are below 1 
equal_to_100 <- df_total[df_total == 1]  #The ones which are ok

df <- df %>%
  mutate(d = ifelse(rowSums(df[c("a","b","c")]) > 1,
                            apply(df[rowSums(df[c("a","b","c")]) > 1,], 1, min) - df_for_sum,
                    ifelse(rowSums(df[c("a","b","c")]) < 1,
                           apply(df[rowSums(df[c("a","b","c")]) < 1,], 1, min) + df_for_minus,
                           ifelse(rowSums(df[c("a","b","c")]) == 1,
                                  apply(df[rowSums(df[c("a","b","c")]) == 1,], 1, min), ""))))

这是输出:

      a    b    c                  d
1  0.60 0.27 0.14               0.13
2  0.48 0.32 0.21                0.2
3  0.42 0.24 0.35               0.23
4  0.28 0.33 0.41               0.26
5  0.52 0.28 0.22                0.2
6  0.34 0.30 0.37               0.29
7  0.38 0.28 0.35               0.27
8  0.34 0.28 0.40               0.26
9  0.53 0.26 0.22               0.21
10 0.17 0.27 0.58               0.15
11 0.34 0.35 0.33               0.31
12 0.19 0.27 0.56               0.17
13 0.56 0.29 0.17               0.15
14 0.55 0.28 0.19               0.17
15 0.29 0.24 0.48               0.23
16 0.23 0.31 0.47               0.22
17 0.40 0.32 0.28               0.33  #From here til the end it's wrong!
18 0.50 0.27 0.24               0.19
19 0.45 0.28 0.27               0.28
20 0.68 0.26 0.05               0.24
21 0.40 0.32 0.28               0.28
22 0.23 0.26 0.50               0.26
23 0.46 0.33 0.20               0.25
24 0.46 0.24 0.28               0.27
25 0.44 0.24 0.31                0.3
26 0.46 0.26 0.27               0.21
27 0.30 0.29 0.40               0.24
28 0.45 0.20 0.34 0.0599999999999999
29 0.53 0.27 0.20               0.33
30 0.33 0.34 0.33               0.06
31 0.20 0.26 0.55               0.15
32 0.65 0.29 0.06               0.27
33 0.45 0.24 0.32               0.17
34 0.30 0.26 0.45               0.15
35 0.20 0.36 0.45               0.17
36 0.38 0.16 0.38               0.24

有什么想法吗?有更简单的方法吗?

最佳答案

您要先计算超额差额:

diff <- 1 - rowSums(df)

然后将其添加到最小值:

df$d <- apply(df, 1, min) + diff

关于r - ifelse dplyr 显示错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43061477/

相关文章:

r - 当列名是年份时减去列

基于几个变量的排名

java - JVM 中的 if(true)。如何生成合适的指令?

php - 使用 mysql if 语句更改按钮按下时的值

r - 在 R 中,我可以过滤至少有 1 个值满足阈值的所有列吗

r - 将列名添加到 dplyr 函数内的 vars()

r - 使用scale_size_area,从顶部和底部添加线条到下一个区域点

r - 从一行中选择前 n 个元素并取它们的平均值

r - 如何使用R检查变量是否分类?

ruby - 在 Ruby 中重构 if elsif else