Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.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嵌套ifelse错误-是向量循环吗?_R_Dplyr - Fatal编程技术网

dplyr嵌套ifelse错误-是向量循环吗?

dplyr嵌套ifelse错误-是向量循环吗?,r,dplyr,R,Dplyr,我可以编写这段代码,向iris数据集添加两列。添加的第一列是前四列的总和。第二个增加的专栏是我对“编程”的尝试 错误:列Size必须是1d原子向量或列表 这一定是我的假设逻辑。对的如果不是这样,逻辑似乎很简单。如果条件1大于output1,否则如果条件2大于output2,否则output3 最后,我使用as.vector将iris.size$size强制转换成一个向量,但我想知道我的逻辑首先哪里出了问题,这样我以后就不必使用创可贴了。在谷歌上搜索一番后,R中的if语句比ifelse语句更受欢迎

我可以编写这段代码,向iris数据集添加两列。添加的第一列是前四列的总和。第二个增加的专栏是我对“编程”的尝试

错误:列
Size
必须是1d原子向量或列表

这一定是我的假设逻辑。对的如果不是这样,逻辑似乎很简单。如果条件1大于
output1
,否则如果条件2大于
output2
,否则
output3


最后,我使用
as.vector
将iris.size$size强制转换成一个向量,但我想知道我的逻辑首先哪里出了问题,这样我以后就不必使用创可贴了。在谷歌上搜索一番后,R中的if语句比ifelse语句更受欢迎,但if语句似乎只处理单个逻辑值,而不是向量。

利用
按行
并将内容拆分一点以提高可读性

iris.size <- iris %>% 
  mutate(Total = 
           apply(.[(1:4)], 1, sum)
  )
iris.size <-iris.size %>% rowwise %>%  mutate(Size = 
           if(
            Total != 0 && Sepal.Width > Petal.Length)  {
             "Output1"
             } else {
             if(Total == 0 && Petal.Length > Petal.Length){
               "Output2"
             } else { 
               "Output3"}}
)
class(iris.size$Size)
[1] "character"


> iris.size %>% arrange(Size)
# A tibble: 150 x 7
   Sepal.Length Sepal.Width Petal.Length Petal.Width
          <dbl>       <dbl>        <dbl>       <dbl>
 1          5.1         3.5          1.4         0.2
 2          4.9         3.0          1.4         0.2
 3          4.7         3.2          1.3         0.2
 4          4.6         3.1          1.5         0.2
 5          5.0         3.6          1.4         0.2
 6          5.4         3.9          1.7         0.4
 7          4.6         3.4          1.4         0.3
 8          5.0         3.4          1.5         0.2
 9          4.4         2.9          1.4         0.2
10          4.9         3.1          1.5         0.1
# ... with 140 more rows, and 3 more variables:
#   Species <fctr>, Total <dbl>, Size <chr>
> 
iris.size%
突变(总=
应用([(1:4)],1,总和)
)
iris.size%行%>%变异(大小=
如果(
总计!=0&&萼片宽度>花瓣长度){
“输出1”
}否则{
如果(总==0&&Petal.Length>Petal.Length){
“输出2”
}否则{
“Output3”}
)
类别(虹膜大小$size)
[1] “角色”
>iris.size%>%排列(大小)
#一个tibble:150x7
萼片。长萼片。宽花瓣。长花瓣。宽
1          5.1         3.5          1.4         0.2
2          4.9         3.0          1.4         0.2
3          4.7         3.2          1.3         0.2
4          4.6         3.1          1.5         0.2
5          5.0         3.6          1.4         0.2
6          5.4         3.9          1.7         0.4
7          4.6         3.4          1.4         0.3
8          5.0         3.4          1.5         0.2
9          4.4         2.9          1.4         0.2
10          4.9         3.1          1.5         0.1
# ... 再增加140行和3个变量:
#种类、总数、大小
> 

利用
行方式
并将内容拆分一点以提高可读性

iris.size <- iris %>% 
  mutate(Total = 
           apply(.[(1:4)], 1, sum)
  )
iris.size <-iris.size %>% rowwise %>%  mutate(Size = 
           if(
            Total != 0 && Sepal.Width > Petal.Length)  {
             "Output1"
             } else {
             if(Total == 0 && Petal.Length > Petal.Length){
               "Output2"
             } else { 
               "Output3"}}
)
class(iris.size$Size)
[1] "character"


> iris.size %>% arrange(Size)
# A tibble: 150 x 7
   Sepal.Length Sepal.Width Petal.Length Petal.Width
          <dbl>       <dbl>        <dbl>       <dbl>
 1          5.1         3.5          1.4         0.2
 2          4.9         3.0          1.4         0.2
 3          4.7         3.2          1.3         0.2
 4          4.6         3.1          1.5         0.2
 5          5.0         3.6          1.4         0.2
 6          5.4         3.9          1.7         0.4
 7          4.6         3.4          1.4         0.3
 8          5.0         3.4          1.5         0.2
 9          4.4         2.9          1.4         0.2
10          4.9         3.1          1.5         0.1
# ... with 140 more rows, and 3 more variables:
#   Species <fctr>, Total <dbl>, Size <chr>
> 
iris.size%
突变(总=
应用([(1:4)],1,总和)
)
iris.size%行%>%变异(大小=
如果(
总计!=0&&萼片宽度>花瓣长度){
“输出1”
}否则{
如果(总==0&&Petal.Length>Petal.Length){
“输出2”
}否则{
“Output3”}
)
类别(虹膜大小$size)
[1] “角色”
>iris.size%>%排列(大小)
#一个tibble:150x7
萼片。长萼片。宽花瓣。长花瓣。宽
1          5.1         3.5          1.4         0.2
2          4.9         3.0          1.4         0.2
3          4.7         3.2          1.3         0.2
4          4.6         3.1          1.5         0.2
5          5.0         3.6          1.4         0.2
6          5.4         3.9          1.7         0.4
7          4.6         3.4          1.4         0.3
8          5.0         3.4          1.5         0.2
9          4.4         2.9          1.4         0.2
10          4.9         3.1          1.5         0.1
# ... 再增加140行和3个变量:
#种类、总数、大小
> 

错误消息是由于
iris.size[“size”]
data.frame()类型的对象造成的。这可以通过
str()
函数确认:

> str(iris.size["Size"])
'data.frame':   150 obs. of  1 variable:
 $ Size: chr [1:150, 1] "Output1" "Output1" "Output1" "Output1" ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr "Sepal.Width"
> 

使用
as.vector()
强制转换对象可以解决此问题,因为数据帧包含1列

错误消息是由于
iris.size[“size”]
data.frame()类型的对象造成的。这可以通过
str()
函数确认:

> str(iris.size["Size"])
'data.frame':   150 obs. of  1 variable:
 $ Size: chr [1:150, 1] "Output1" "Output1" "Output1" "Output1" ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr "Sepal.Width"
> 

使用
as.vector()
强制转换对象可以解决此问题,因为数据帧包含1列

当您运行代码时,您得到的输出为
iris.size

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Total Sepal.Width
1          5.1         3.5          1.4         0.2  setosa  10.2     Output1
2          4.9         3.0          1.4         0.2  setosa   9.5     Output1
3          4.7         3.2          1.3         0.2  setosa   9.4     Output1
4          4.6         3.1          1.5         0.2  setosa   9.4     Output1
5          5.0         3.6          1.4         0.2  setosa  10.2     Output1
6          5.4         3.9          1.7         0.4  setosa  11.4     Output1
它不显示
Size
的原因是尚未创建列
Size
。发生这种情况的原因是,您正在将类
data.frame()
的两个对象与
[2]>.[3]
进行比较,而不是与
[,2]>.[3]
进行比较

我仍在努力理解正在创建的内容。“萼片宽度”列是什么?

根据以下内容调整您的:

iris.size <- iris %>%    mutate(Total = 
           apply(.[(1:4)], 1, sum)   ) %>%    mutate(Size = 
           ifelse(
             apply(.[(1:4)], 1, sum) != 0 & 
               .[,2] > .[,3], "Output1", 
             ifelse(
               apply(.[(1:4)], 1, sum) == 0 & 
                 .[,2] > .[,3], "Output2", 
               "Output3")
           )   )

iris.size
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Total    Size
1          5.1         3.5          1.4         0.2  setosa  10.2 Output1
2          4.9         3.0          1.4         0.2  setosa   9.5 Output1
3          4.7         3.2          1.3         0.2  setosa   9.4 Output1
4          4.6         3.1          1.5         0.2  setosa   9.4 Output1
5          5.0         3.6          1.4         0.2  setosa  10.2 Output1
6          5.4         3.9          1.7         0.4  setosa  11.4 Output1

当您运行代码时,您将以
iris.size
的形式获得此输出:

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species Total Sepal.Width
1          5.1         3.5          1.4         0.2  setosa  10.2     Output1
2          4.9         3.0          1.4         0.2  setosa   9.5     Output1
3          4.7         3.2          1.3         0.2  setosa   9.4     Output1
4          4.6         3.1          1.5         0.2  setosa   9.4     Output1
5          5.0         3.6          1.4         0.2  setosa  10.2     Output1
6          5.4         3.9          1.7         0.4  setosa  11.4     Output1
它不显示
Size
的原因是尚未创建列
Size
。发生这种情况的原因是,您正在将类
data.frame()
的两个对象与
[2]>.[3]
进行比较,而不是与
[,2]>.[3]
进行比较

我仍在努力理解正在创建的内容。“萼片宽度”列是什么?

根据以下内容调整您的:

iris.size <- iris %>%    mutate(Total = 
           apply(.[(1:4)], 1, sum)   ) %>%    mutate(Size = 
           ifelse(
             apply(.[(1:4)], 1, sum) != 0 & 
               .[,2] > .[,3], "Output1", 
             ifelse(
               apply(.[(1:4)], 1, sum) == 0 & 
                 .[,2] > .[,3], "Output2", 
               "Output3")
           )   )

iris.size
Sepal.Length Sepal.Width Petal.Length Petal.Width Species Total    Size
1          5.1         3.5          1.4         0.2  setosa  10.2 Output1
2          4.9         3.0          1.4         0.2  setosa   9.5 Output1
3          4.7         3.2          1.3         0.2  setosa   9.4 Output1
4          4.6         3.1          1.5         0.2  setosa   9.4 Output1
5          5.0         3.6          1.4         0.2  setosa  10.2 Output1
6          5.4         3.9          1.7         0.4  setosa  11.4 Output1

一个多小时前刚问过的帖子的副本?!你得相信我的话。我与被问的另一个问题无关<代码>[2]>[3]
表示第二列大于第三列。如果你看到我的实际数据帧(敏感信息,不能在这里发布),这会更有意义。但同样的错误在应用于虹膜数据集时也会发生。我可以在下面解释一下。如果
Sepal.Width>Petal.Length
且数据集不包含
NA
值,那么总数永远不会为零。关于何时/何地/为什么使用if、ifelse或else if,是否有明确的简明指南。我不是程序员,我只是想成为一名程序员。谷歌在这个问题上做得不太好。一个多小时前刚问过的帖子的副本?!你得相信我的话。我与被问的另一个问题无关<有限公司