Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr中每个突变_的意外行为-用于突变的variabel发生了突变_R_Dplyr - Fatal编程技术网

dplyr中每个突变_的意外行为-用于突变的variabel发生了突变

dplyr中每个突变_的意外行为-用于突变的variabel发生了突变,r,dplyr,R,Dplyr,我在dplyr中遇到了意想不到的行为。我试图通过其中一个变量的值对数据集中的所有变量进行加权。这是饮食数据,每一份都有营养价值。这一份食物的重量是已知的,我希望分析每克食物的重量,而不是每一份 服务重量是数据集中的第十个数字变量。前九个已正确转换。权重变量也正确设置为1。后续变量保持不变(或可能除以1)。这是出乎意料的 这个问题可以通过在数据帧的末尾创建一个新变量来解决,该变量保存服务权重变量的值。它也可以通过在mutate语句中保留weight变量来修复,但我选择不这样做,因为它提供了一个有用

我在dplyr中遇到了意想不到的行为。我试图通过其中一个变量的值对数据集中的所有变量进行加权。这是饮食数据,每一份都有营养价值。这一份食物的重量是已知的,我希望分析每克食物的重量,而不是每一份

服务重量是数据集中的第十个数字变量。前九个已正确转换。权重变量也正确设置为1。后续变量保持不变(或可能除以1)。这是出乎意料的

这个问题可以通过在数据帧的末尾创建一个新变量来解决,该变量保存服务权重变量的值。它也可以通过在mutate语句中保留weight变量来修复,但我选择不这样做,因为它提供了一个有用的检查

下面是一个简短的例子,说明了我的观点:-

library(dplyr)
a <- letters[1:6]
x1 <- rep(1,6);x2 <- rep(2,6);x3 <- rep(3,6)
x4 <- rep(4,6);x5 <- rep(5,6);x6 <- rep(6,6)
#I want to divide each variable by one of the variables - Two examples
d <- data.frame(a,x1,x2,x3,x4,x5,x6)
d %>% mutate_each(funs(Weight = ./x3),x1:x6) #Unexpected!
d %>% mutate_each(funs(Weight = ./x4),x1:x6) #Unexpected!
解决方法:

这是有意义的,因为dplyr允许您创建和使用新的变量。然而,对我来说,这种特定的行为是违反直觉的,也许是因为我总是认为突变是原子的。在这种情况下,他们不是


我想我现在可能已经回答了我原来的问题,但我会在这里为其他被同样行为所伤害的人发帖。这有意义吗?我是否正确理解了该行为?

另一种解决方法是引用数据框前面的变量
d$x3
。由于默认情况下,它应用于所有非分组变量,因此我们仅排除列
-a
,以避免将因子除以数字并生成NAs:

d %>% mutate_each(funs(Weight = ./d$x3), -a)
输出:

  a        x1        x2 x3 x4 x5 x6
1 a 0.3333333 0.6666667  1  4  5  6
2 b 0.3333333 0.6666667  1  4  5  6
3 c 0.3333333 0.6666667  1  4  5  6
4 d 0.3333333 0.6666667  1  4  5  6
5 e 0.3333333 0.6666667  1  4  5  6
6 f 0.3333333 0.6666667  1  4  5  6

     a   x1  x2   x3 x4 x5 x6
1 a 0.25 0.5 0.75  1  5  6
2 b 0.25 0.5 0.75  1  5  6
3 c 0.25 0.5 0.75  1  5  6
4 d 0.25 0.5 0.75  1  5  6
5 e 0.25 0.5 0.75  1  5  6
6 f 0.25 0.5 0.75  1  5  6
  a        x1        x2 x3       x4       x5 x6 Three Four
1 a 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
2 b 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
3 c 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
4 d 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
5 e 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
6 f 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4

  a   x1  x2   x3 x4   x5  x6 Three Four
1 a 0.25 0.5 0.75  1 1.25 1.5     3    4
2 b 0.25 0.5 0.75  1 1.25 1.5     3    4
3 c 0.25 0.5 0.75  1 1.25 1.5     3    4
4 d 0.25 0.5 0.75  1 1.25 1.5     3    4
5 e 0.25 0.5 0.75  1 1.25 1.5     3    4
6 f 0.25 0.5 0.75  1 1.25 1.5     3    4
  a        x1        x2 x3       x4       x5 x6
1 a 0.3333333 0.6666667  1 1.333333 1.666667  2
2 b 0.3333333 0.6666667  1 1.333333 1.666667  2
3 c 0.3333333 0.6666667  1 1.333333 1.666667  2
4 d 0.3333333 0.6666667  1 1.333333 1.666667  2
5 e 0.3333333 0.6666667  1 1.333333 1.666667  2
6 f 0.3333333 0.6666667  1 1.333333 1.666667  2
Source: local data frame [6 x 7]
Groups: a [6]

       a        x1        x2    x3       x4       x5    x6
  (fctr)     (dbl)     (dbl) (dbl)    (dbl)    (dbl) (dbl)
1      a 0.3333333 0.6666667     3 1.333333 1.666667     2
2      b 0.3333333 0.6666667     3 1.333333 1.666667     2
3      c 0.3333333 0.6666667     3 1.333333 1.666667     2
4      d 0.3333333 0.6666667     3 1.333333 1.666667     2
5      e 0.3333333 0.6666667     3 1.333333 1.666667     2
6      f 0.3333333 0.6666667     3 1.333333 1.666667     2
如果我们要分组,那么我们需要使用scoa指示的方法,排除该变量,因为
d$x3
会产生错误。注意,因为我们是按变量
a
分组的,所以这次不需要排除它

d %>% group_by(a) %>% mutate_each(funs(Weight = ./x3), -x3) 
输出:

  a        x1        x2 x3 x4 x5 x6
1 a 0.3333333 0.6666667  1  4  5  6
2 b 0.3333333 0.6666667  1  4  5  6
3 c 0.3333333 0.6666667  1  4  5  6
4 d 0.3333333 0.6666667  1  4  5  6
5 e 0.3333333 0.6666667  1  4  5  6
6 f 0.3333333 0.6666667  1  4  5  6

     a   x1  x2   x3 x4 x5 x6
1 a 0.25 0.5 0.75  1  5  6
2 b 0.25 0.5 0.75  1  5  6
3 c 0.25 0.5 0.75  1  5  6
4 d 0.25 0.5 0.75  1  5  6
5 e 0.25 0.5 0.75  1  5  6
6 f 0.25 0.5 0.75  1  5  6
  a        x1        x2 x3       x4       x5 x6 Three Four
1 a 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
2 b 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
3 c 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
4 d 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
5 e 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4
6 f 0.3333333 0.6666667  1 1.333333 1.666667  2     3    4

  a   x1  x2   x3 x4   x5  x6 Three Four
1 a 0.25 0.5 0.75  1 1.25 1.5     3    4
2 b 0.25 0.5 0.75  1 1.25 1.5     3    4
3 c 0.25 0.5 0.75  1 1.25 1.5     3    4
4 d 0.25 0.5 0.75  1 1.25 1.5     3    4
5 e 0.25 0.5 0.75  1 1.25 1.5     3    4
6 f 0.25 0.5 0.75  1 1.25 1.5     3    4
  a        x1        x2 x3       x4       x5 x6
1 a 0.3333333 0.6666667  1 1.333333 1.666667  2
2 b 0.3333333 0.6666667  1 1.333333 1.666667  2
3 c 0.3333333 0.6666667  1 1.333333 1.666667  2
4 d 0.3333333 0.6666667  1 1.333333 1.666667  2
5 e 0.3333333 0.6666667  1 1.333333 1.666667  2
6 f 0.3333333 0.6666667  1 1.333333 1.666667  2
Source: local data frame [6 x 7]
Groups: a [6]

       a        x1        x2    x3       x4       x5    x6
  (fctr)     (dbl)     (dbl) (dbl)    (dbl)    (dbl) (dbl)
1      a 0.3333333 0.6666667     3 1.333333 1.666667     2
2      b 0.3333333 0.6666667     3 1.333333 1.666667     2
3      c 0.3333333 0.6666667     3 1.333333 1.666667     2
4      d 0.3333333 0.6666667     3 1.333333 1.666667     2
5      e 0.3333333 0.6666667     3 1.333333 1.666667     2
6      f 0.3333333 0.6666667     3 1.333333 1.666667     2

我同意总是按顺序修改x1:x6并不好。如果可以关闭,那就太好了。考虑到你已经回答了自己的问题,你可以把它作为答案发布。然后其他人一眼就会发现问题已经解决了。它看起来像一个bug。也许你应该报告它:。请注意,您可以通过明确排除权重变量来避免这种行为,而无需创建新列,例如
d%>%mutate_each(funs(Weight=./x3),x1:x6,-x3)
scoa当然是正确的-我之所以注意到这一点,是因为我的数据中大约有80列,而我(实际上)到处都使用v1:v80@阿斯汀:(后期编辑)山姆·菲尔克的真正意思是,如果你自己找到答案。在标题中添加“已回答”是不必要的,因为“已接受”标记就足以说明问题。