为什么基R`ifelse()`会间歇性地将我的字符向量转换为矩阵?

时间:2019-04-25 16:24:07

标签: r if-statement

library(tidyverse)
df <- tibble(col1 = c(5, 2), col2 = c(6, 4), col3 = c(9, 9))
# # A tibble: 2 x 3
#    col1  col2  col3
#   <dbl> <dbl> <dbl>
# 1     5     6     9
# 2     2     4     9


df.cha <- df %>% mutate(col4 = ifelse(apply(.[, 1:3], 1, sd) > 3,
                                      "True",
                                      "False"))
df.cha$col4
#[1] "False" "True" 

上面的代码工作正常。第4列是我希望的字符列。但是,我可以在ifelse语句中添加一个额外的条件,即& .[, 3] > 0,突然之间R正在为第4列创建矩阵,而不是像我想要的那样将其保留为字符向量。见下文。

这是为什么?

df.mat <- df %>% mutate(col4 = ifelse(apply(.[, 1:3], 1, sd) > 3 & 
                                        .[, 3] > 0,  # I only added this
                                      "True",
                                      "False"))
df.mat$col4
#      col3   
# [1,] "False"
# [2,] "True" 

1 个答案:

答案 0 :(得分:5)

@GetMapping(value="/changeWholeName") public List<User> changeWholeName(){ List<User> users =new ArrayList<User>(); User user1=new User(); user1.setName("mint1"); user1.setAge(19); user1.setPass("123456"); users.add(user1); User user2=new User(); user2.setName("mint3"); user2.setAge(192); user2.setPass("1234516"); users.add(user2); return users; } 首先将输入转换为矩阵,然后在该矩阵上运行sd()时,将得到一个简单的向量。

但是当您进行apply()动作时,便会返回一个动作。选择一列并不会像data.frames一样简化为向量。请注意,如果.[,3]是data.frame而不是tibble,则会得到不同的行为。

因此,“问题”与df无关。事实上,您正在对小对象进行比较,因此保留了形状而不是简化为矢量。碰巧的是,tibble +大于/小于-将按设计返回矩阵。