将数据框中的两列或更多列合并为具有新名称的新列

时间:2013-08-07 23:35:01

标签: r dataframe multiple-columns r-faq

例如,如果我有这个:

n = c(2, 3, 5) 
s = c("aa", "bb", "cc") 
b = c(TRUE, FALSE, TRUE) 
df = data.frame(n, s, b)

  n  s     b
1 2 aa  TRUE
2 3 bb FALSE
3 5 cc  TRUE

然后,我如何将两列n和s组合成一个名为x的新列,使其看起来像这样:

  n  s     b     x
1 2 aa  TRUE  2 aa
2 3 bb FALSE  3 bb
3 5 cc  TRUE  5 cc

8 个答案:

答案 0 :(得分:91)

使用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

答案 1 :(得分:19)

用于插入分隔符:

func doTask(_ password:String) {
    let taskOne = Process()
    taskOne.launchPath = "/bin/echo"
    taskOne.arguments = [password]

    let taskTwo = Process()
    taskTwo.launchPath = "/usr/bin/sudo"
    taskTwo.arguments = ["-S", "/usr/bin/xattr", "-d", "-r", "com.test.exemple", " /Desktop/file.extension"]
    //taskTwo.arguments = ["-S", "/usr/bin/touch", "/tmp/foo.bar.baz"]

    let pipeBetween:Pipe = Pipe()
    taskOne.standardOutput = pipeBetween
    taskTwo.standardInput = pipeBetween

    let pipeToMe = Pipe()
    taskTwo.standardOutput = pipeToMe
    taskTwo.standardError = pipeToMe

    taskOne.launch()
    taskTwo.launch()

    let data = pipeToMe.fileHandleForReading.readDataToEndOfFile()
    let output : String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
    print(output)
}

答案 2 :(得分:9)

使用应用

删除NA并删除它们的一些示例
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

答案 3 :(得分:8)

正如Uwe和UseR的评论中已经提到的, var firSet = new Dictionary<string, string[]>() { { "a", new[] {"ab", "abc"} }, { "b", new[] {"bc", "bcd"} } } .ToDictionary(i => i.Key, i => i.Value.ToList()); 格式的一般解决方案是使用命令tidyverse

unite

答案 4 :(得分:7)

使用dplyr::mutate

library(dplyr)
df <- mutate(df, x = paste(n, s)) 

df 
> df
  n  s     b    x
1 2 aa  TRUE 2 aa
2 3 bb FALSE 3 bb
3 5 cc  TRUE 5 cc

答案 5 :(得分:5)

我们可以使用 paste0

df$combField <- paste0(df$x, df$y)

如果您不希望在连接字段中引入任何填充空间。如果您计划将组合字段用作表示两个字段组合的唯一ID,则此选项更有用。

答案 6 :(得分:4)

代替

  • paste(不整洁),
  • paste0(默认分隔符)或
  • unite(限于2列和1个分隔符),

我建议使用更灵活的替代方法:stringr::str_c

library("tidyverse")
df %>% mutate(x=str_c(n,"-",s,".",b))
#> # A tibble: 3 x 4
#>       n s     b     x         
#>   <dbl> <fct> <lgl> <chr>     
#> 1     2 aa    TRUE  2-aa.TRUE 
#> 2     3 bb    FALSE 3-bb.FALSE
#> 3     5 cc    TRUE  5-cc.TRUE 

答案 7 :(得分:3)

还有其他一些很好的答案,但是如果您不知道要事先连接的列名或列数,则以下操作很有用。

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 = ""))