Answers:
使用 paste
。
df$x <- paste(df$n,df$s)
df
# n s b x
# 1 2 aa TRUE 2 aa
# 2 3 bb FALSE 3 bb
# 3 5 cc TRUE 5 cc
paste(df$n,df$s,sep="-")
s
具有NA值,如何省略NA ?(我不喜欢看3 NA
是否df$s[2]=NA
)
对于插入分隔符:
df$x <- paste(df$n, "-", df$s)
A - B
而不是A-B
。是否可以删除此多余的空间?
paste(df$n,df$s,sep="-")
sep
参数...)。另一个答案比您的答案早了将近四年,但是它可以完美地回答这个问题。
正如Uwe和UseR的评论中已经提到的,该tidyverse
格式的一般解决方案是使用以下命令unite
:
library(tidyverse)
n = c(2, 3, 5)
s = c("aa", "bb", "cc")
b = c(TRUE, FALSE, TRUE)
df = data.frame(n, s, b) %>%
unite(x, c(n, s), sep = " ", remove = FALSE)
x
代表包含组合值的新列的名称。想想dplyr的问题mutate
:df %>% dplyr::mutate(x = "your operations")
NA的一些示例及其使用apply的删除
n = c(2, NA, NA)
s = c("aa", "bb", NA)
b = c(TRUE, FALSE, NA)
c = c(2, 3, 5)
d = c("aa", NA, "cc")
e = c(TRUE, NA, TRUE)
df = data.frame(n, s, b, c, d, e)
paste_noNA <- function(x,sep=", ") {
gsub(", " ,sep, toString(x[!is.na(x) & x!="" & x!="NA"] ) ) }
sep=" "
df$x <- apply( df[ , c(1:6) ] , 1 , paste_noNA , sep=sep)
df
tidyr
软件包来重现原始问题的预期答案,那将是一个单行代码:tidyr::unite(df, x, n, s, sep = " ", remove = FALSE)[, c(names(df), "x")]
。但是,我认为这样做没有理由df$x <- paste(df$n,df$s)
更简单。
paste
或增加价值tidyr::unite
。
代替
paste
(默认空格), paste0
(强制将缺失内容包含在内NA
)或unite
(限于2列和1个分隔符), 我建议另一种方法尽可能灵活,paste0
但要谨慎一些NA
:stringr::str_c
library(tidyverse)
# check the missing value!!
df <- tibble(
n = c(2, 2, 8),
s = c("aa", "aa", NA_character_),
b = c(TRUE, FALSE, TRUE)
)
df %>%
mutate(
paste = paste(n,"-",s,".",b),
paste0 = paste0(n,"-",s,".",b),
str_c = str_c(n,"-",s,".",b)
) %>%
# convert missing value to ""
mutate(
s_2=str_replace_na(s,replacement = "")
) %>%
mutate(
str_c_2 = str_c(n,"-",s_2,".",b)
)
#> # A tibble: 3 x 8
#> n s b paste paste0 str_c s_2 str_c_2
#> <dbl> <chr> <lgl> <chr> <chr> <chr> <chr> <chr>
#> 1 2 aa TRUE 2 - aa . TRUE 2-aa.TRUE 2-aa.TRUE "aa" 2-aa.TRUE
#> 2 2 aa FALSE 2 - aa . FALSE 2-aa.FALSE 2-aa.FALSE "aa" 2-aa.FALSE
#> 3 8 <NA> TRUE 8 - NA . TRUE 8-NA.TRUE <NA> "" 8-.TRUE
由reprex软件包(v0.3.0)创建于2020-04-10
str_c
文档中的额外说明
像大多数其他R函数一样,缺失值是“传染性的”:每当缺失值与另一个字符串组合时,结果总是会缺失。使用
str_replace_na()
转换NA
到"NA"
paste0(n,"-",s,".",b)
并且str_c(n,"-",s,".",b)
完全相同,都使用默认的分隔符,即空字符串''
。我也不知道为什么paste
要“整洁”,你的意思是你不喜欢空格?
paste0
并且str_c
不完全相同。看看这些链接:(1)rdocumentation.org/packages/stringr/versions/1.3.1/topics/str_c(2)stackoverflow.com/questions/53118271/...
str_c
文档也可能更加具体!)。
还有其他一些很好的答案,但是如果您不知道要预先连接的列名或列数,则可以使用以下内容。
df = data.frame(x = letters[1:5], y = letters[6:10], z = letters[11:15])
colNames = colnames(df) # could be any number of column names here
df$newColumn = apply(df[, colNames, drop = F], MARGIN = 1, FUN = function(i) paste(i, collapse = ""))
paste()
?对于上面的示例,x
column的数据应为2-aa
,然后为3-bb
和5-cc
。