【问题标题】:Is there a way to paste a statement with column-names and use it to create a new column in R?有没有办法粘贴带有列名的语句并使用它在 R 中创建一个新列?
【发布时间】:2020-05-06 18:44:15
【问题描述】:

我有一个 df,

df <- data.frame(X1 = c('1','0', '1','1', '1'), X2 = c('1','0', '1','0', '1'), X3 = c('1','0', '1','0', '1'), X4 = c('1','0', '1','0', '1'))

而且我想沿着上面写着的列创建一些测试用例

'1 & 0 & 1 & 1 & 1'

每行以此类推。我的预期输出是

df <- data.frame(X1 = c('1','0', '1','1', '1'), X2 = c('1','0', '1','0', '1'), X3 = c('1','0', '1','0', '1'), X4 = c('1','0', '1','0', '1'), tc= c("1 & 1 & 1 & 1", "0 & 0 & 0 & 0", "1 & 1 & 1 & 1", "1 & 0 & 0 & 0", "1 & 1 & 1 & 1"))

我不确定这是否是最简单的方法。但我用 noquote、toString 和 lapply 构建了一个字符串:

string <-  noquote(toString(lapply(1:3, function(x){noquote(sprintf("df$X%s, '&'", x))})))
string
#df$X1, '&', df$X2, '&', df$X3, '&'

并尝试使用粘贴来激活它


df$tc <- paste(string, df$X4)

但是它只粘贴 X4 的最后一个值,使我的测试用例看起来像:

head(df$tc)

[1] "df$X1, '&', df$X2, '&', df$X3, '&' 1" "df$X1, '&', df$X2, '&', df$X3, '&' 0"
[3] "df$X1, '&', df$X2, '&', df$X3, '&' 1" "df$X1, '&', df$X2, '&', df$X3, '&' 0"
[5] "df$X1, '&', df$X2, '&', df$X3, '&' 1"

我找到的唯一解决方案是将我创建的字符串复制到粘贴语句中


df$tc <-paste(df$X1, '&', df$X2, '&', df$X3, '&', df$X4)

但是看起来不太好,有时我的测试用例超过100个,字符串很长。

反正我可以这样粘贴结果吗?

df$tc <- paste(string, df$X4)

或者有更聪明的方法吗?

提前致谢!

【问题讨论】:

    标签: r string dataframe paste


    【解决方案1】:

    我们可以使用do.callpaste

    df$tc <- do.call(paste, c(df, sep=" & "))
    df$tc
    #[1] "1 & 1 & 1 & 1" "0 & 0 & 0 & 0" "1 & 1 & 1 & 1" "1 & 0 & 0 & 0" "1 & 1 & 1 & 1"
    

    或者reducestr_c

    library(dplyr)
    library(purrr)
    library(stringr)
    df %>%
        mutate(tc = reduce(., str_c, sep=" & "))
    

    【讨论】:

      【解决方案2】:

      其他解决方案

      library(stringr)
      df$tc <- apply(df, 1, function(x) str_c(x, collapse = " & "))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 2011-05-06
        相关资源
        最近更新 更多