【问题标题】:R - Make unique strings in a data frameR - 在数据框中创建唯一的字符串
【发布时间】:2013-12-03 14:00:29
【问题描述】:

我想将一列(可能)非唯一字符串变成一列唯一字符串。

例如,考虑:

df <- data.frame(
     'Initials' = c("AA","AB","AB")
     , 'Data' = c(1,2,3)
 )
df
  Initials Data
1       AA    1
2       AB    2
3       AB    3

我想得到这个:

  Initials Data    
1       AA        1
2       AB (1)    2
3       AB (2)    3

谢谢!

注意:我知道我可以使用行名来唯一标识行,但我想保留存储在 Initials 列中的字符串,并附加一个数字。

【问题讨论】:

    标签: r unique


    【解决方案1】:
    transform(df, Initials = ave(as.character(Initials), Initials, 
           FUN = function(x) if (length(x) > 1) paste0(x, " (", seq(x), ")") else x))
    
    #   Initials Data
    # 1       AA    1
    # 2   AB (1)    2
    # 3   AB (2)    3
    

    【讨论】:

    • 我本来建议在 Initials 列上使用 make.unique,但这更灵活——更不用说满足 OP 的确切格式要求了。
    • 谢谢!实际上我在问这个问题之前玩过 make.unique ,但无法让它工作(除了colnames)。我喜欢这里的语法易于“阅读”。
    • 我从来没有想过要查找ave,这是我以前没有使用过的。很难猜测“因素水平组合上的组平均值”在这里会很有用。并为超级快速的答案 +1。
    • 好的,我认为这对我来说很清楚,但现在我需要问:seq(x) 究竟是如何在这里工作的?我不太明白它是如何作用于我认为是字符元素的向量 (x) 的。考虑:`nfooave((nfoo), nfoo, FUN = function(x) print(x) ) 返回[1] "AA" "AA" [1] "AB" "AB" [1] "AC" [1] "AA" "AB" "AB" "AC" "AA"。最后一行值是从哪里来的,鉴于它的长度为 5,为什么 paste..seq(x)... 不对输入做任何事情?感谢您的帮助。
    • 哦,没关系——前3个输出来自print;最后一个是 ave 的输出。对不起。
    【解决方案2】:
    w <- ave(df$Data, df$Initials, FUN = seq_along )
    > df$Initials <- paste(df$Initials, "(", w, ")", sep = "")
    # > df
    #   Initials Data
    # 1    AA(1)    1
    # 2    AB(1)    2
    # 3    AB(2)    3
    

    【讨论】:

    • 几乎,我会说,并且可能足以达到目的。严格来说,需要第二遍才能避免 AA(1)。注意:使用 paste0 代替 sep=""。
    • +1:感谢 user1317221_G!我选择了 Sven 的答案,因为 1)我发现语法更容易阅读,2)我试图避免美元语法 df$Data,由于各种原因,这给我带来了问题(名称 Data 是来自闪亮的反应函数,数据框有时只有一列,等等)。再次,我非常感激。
    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多