dplyr嵌套ifelse错误-是向量循环吗?
我可以编写这段代码,向iris数据集添加两列。添加的第一列是前四列的总和。第二个增加的专栏是我对“编程”的尝试 错误:列dplyr嵌套ifelse错误-是向量循环吗?,r,dplyr,R,Dplyr,我可以编写这段代码,向iris数据集添加两列。添加的第一列是前四列的总和。第二个增加的专栏是我对“编程”的尝试 错误:列Size必须是1d原子向量或列表 这一定是我的假设逻辑。对的如果不是这样,逻辑似乎很简单。如果条件1大于output1,否则如果条件2大于output2,否则output3 最后,我使用as.vector将iris.size$size强制转换成一个向量,但我想知道我的逻辑首先哪里出了问题,这样我以后就不必使用创可贴了。在谷歌上搜索一番后,R中的if语句比ifelse语句更受欢迎
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,是否有明确的简明指南。我不是程序员,我只是想成为一名程序员。谷歌在这个问题上做得不太好。一个多小时前刚问过的帖子的副本?!你得相信我的话。我与被问的另一个问题无关<有限公司