我想将以下函数应用于数据帧的变量名称。但是为了这个问题,我将使用向量代替(因为名称(df)也是一个向量)。
我想首先,(1)将向量元素中的所有字符转换为大写,然后,(2)用" _"替换所有中间空格。最后,(3)将特定字符填充到向量中每个元素的末尾。这是我写的功能:
pad <- function(vec,pastechr){
names(vec) <- names(vec) %>%
toupper() %>%
str_replace_all(" ", "_") %>%
if_else(pastechr!="",paste(pastechr,sep="_"),paste0(""))
}
我想在3个向量上应用此函数:
vec1 <- c("A","B B","C c")
vec2 <- c("PP p","Q Q","r")
vec3 <- c("x","y z")
这样,我会粘贴&#34; 123&#34;到vec1,&#34; 456&#34;到元素末尾的vec2。我不想粘贴任何东西到vec3。因此,
pad(vec1,"123")
pad(vec2,"456")
pad(vec3,"")
我想要的是:
pad(vec1,"123")
[1] "A_123","B_B_123","C_C_123"
pad(vec2,"456")
[1] "PP_P_456","Q_Q_456","R_456"
pad(vec3,"")
[1] "X","Y_Z"
我收到了错误:
错误:
condition
必须是逻辑
我认为它必须与if_else
行有关,所以我尝试了:
if(pastechr!="") {paste(pastechr,sep="_")}
和
if_else(pastechr=="",paste0(""),paste(pastechr,sep="_"))
但他们不会工作。有什么建议?感谢。
答案 0 :(得分:2)
问题是管道%>%
将您的向量(上一个操作的结果)作为ifelse
(不是if_else
)的第一个参数传递,但是ifelse
期待测试作为第一个参数。另请注意,向量的names
为NULL
。
我会使用类似的东西:
library(magrittr)
library(stringr)
pad <- function(vec, pastechr){
vec <- vec %>%
toupper() %>%
str_replace_all(" ", "_")
if (pastechr != "") {
vec <- paste(vec, pastechr, sep = "_")
}
vec
}
vec1 <- c("A","B B","C c")
vec2 <- c("PP p","Q Q","r")
vec3 <- c("x","y z")
pad(vec1,"123")
pad(vec2,"456")
pad(vec3,"")
结果是:
> pad(vec1,"123")
[1] "A_123" "B_B_123" "C_C_123"
> pad(vec2,"456")
[1] "PP_P_456" "Q_Q_456" "R_456"
> pad(vec3,"")
[1] "X" "Y_Z"
>