【问题标题】:Conditionally Concatenate String有条件地连接字符串
【发布时间】:2017-03-07 12:43:26
【问题描述】:

我有一个包含这 5 列的数据框

val1 val2 val3 val4 val5
1    0    3    0    5
0    0    0    0    5
1    2    0    0    0

我试图创建一个带有条件连接的新列(结果不能连接零)

val6
1,3,5
5
1,2

等等

有什么想法吗?

【问题讨论】:

  • 也可能类似于gsub(",NA|NA,", "", do.call(paste, c(sep = ",", replace(df, df == 0, NA))))

标签: r conditional string-concatenation


【解决方案1】:

我认为这是重复的。但是,找不到这么回答的人。

我们可以逐行使用apply 并删除值为0 的元素并粘贴以逗号分隔的剩余值。

df$val6 <- apply(df, 1, function(x) paste0(x[x!=0], collapse = ","))
df

#  val1 val2 val3 val4 val5  val6
#1    1    0    3    0    5 1,3,5
#2    0    0    0    0    5     5
#3    1    2    0    0    0   1,2

另一种选择是使用by

df$val6 <- by(df, 1:nrow(df), function(x) paste0(x[x!=0], collapse = ","))

【讨论】:

  • 不幸的是,apply 在 data.frame 上的效率非常低,因为数据被转换为矩阵,需要复制整个数据(不同的内存布局意味着它不能共享表示)。
【解决方案2】:

我们可以试试replacegsub

gsub("NA\\s*|\\s*NA|NA+", "", do.call(paste,replace(df1, df1==0, NA)))
#[1] "1 3 5" "5"     "1 2"  

【讨论】:

    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    相关资源
    最近更新 更多