组合具有相同名称的列时,如何控制附加标识符?

时间:2017-05-03 05:59:40

标签: r dataframe

我想说我想从两个数据帧中选择一些列并将它们组合起来;但是,它们的名称相同。没问题:

mtcars_1 = mtcars
mtcars_2 = mtcars

mt_combined = data.frame(mtcars_1[, 1:3], mtcars_2[, 2:3])

现在,两个数据框中存在的列的名称都是disp.1,依此类推。我想要的是能够控制附加的字符串,以便得到类似disp.mtcars_2的内容,甚至更好disp.(somevariabledefinedinfunction)

我怎样才能做到这一点?

请注意,在此示例中显然mtcars_1_2是相同的,但可能会出现这种情况的情况,即我有两个数据帧具有相同的观察数但来自不同的日期等等。

2 个答案:

答案 0 :(得分:1)

我们可以将setNamespaste

一起使用
mt_combined <- data.frame(mtcars[,1:3],  setNames(mtcars_2[,2:3], 
                          paste0(names(mtcars)[2:3], ".mtcars_2")))

我们还可以创建一个功能,使用quosures的devel版本中的dplyr(即将发布0.6.0

 f1 <- function(dat1, dat2, colInd1, colInd2){
    str1 <- quo_name(enquo(dat2))
    newN <- paste0(names(dat2)[colInd2], ".",str1)
    names(dat2)[colInd2] <- newN
    dat1 %>%
          select(colInd1) %>%
          bind_cols(., select(dat2, colInd2))

 }

 head(f1(mtcars_1, mtcars_2, 1:3, 2:3), 2)
 #    mpg cyl disp cyl.mtcars_2 disp.mtcars_2
 #1  21   6  160            6           160
 #2  21   6  160            6           160

此处,enquo接受输入参数,并从substitute执行与base R类似的工作,将其转换为quosurequo_name将其转换为paste要在Year Quarter Total Year 2016 Q1 2.688.627.598 Year 2016 Q2 2.114.089.713 Year 2016 Q3 3.064.536.554 Year 2016 Q4 3.451.472.537

中使用的字符串

答案 1 :(得分:1)

如果在data.frame中命名data.frame参数,它将在名称前加上,例如

head(data.frame(df1 = mtcars[, 1:3], df2 = mtcars[, 2:3]))
#>                   df1.mpg df1.cyl df1.disp df2.cyl df2.disp
#> Mazda RX4            21.0       6      160       6      160
#> Mazda RX4 Wag        21.0       6      160       6      160
#> Datsun 710           22.8       4      108       4      108
#> Hornet 4 Drive       21.4       6      258       6      258
#> Hornet Sportabout    18.7       8      360       8      360
#> Valiant              18.1       6      225       6      225

为了更好地控制,请事先直接设置列名称。