【问题标题】:How can I make a data frame of the unique values in an existing column?如何制作现有列中唯一值的数据框?
【发布时间】:2020-02-07 16:47:05
【问题描述】:

我需要仅使用与现有数据框中另一列 (col.2) 中的唯一值相对应的前一列 (col.1) 中的出现来创建一个新数据框 (col.3)。

我需要这个:

df1
col.1   col.2     
    1    1             
    1    3             
    1    7             
    1    7            
    2    12                
    2    14   
    2    14
    2    14

 df2
 col.3
     1
     1
     1
     2
     2 

我试过这个:

new.col <- cbind(df$col.1[unique(df$col.2)])

但它给了我一个既太长又不包括完整的col.1值集的列

我怀疑plyr 对此有一个简单的解决方案,但我还没有想到(或任何其他解决方案)。

我怎样才能达到我想要的结果?最好使用plyr,但base 也可以。

【问题讨论】:

    标签: r dplyr plyr


    【解决方案1】:

    我们可以使用duplicated 创建一个逻辑索引并使用它来对行进行子集化

    df2 <- data.frame(col3. = df$col.1[!duplicated(df$col.2)])
    

    subset

    subset(df, !duplicated(col.2), select = col.1)
    

    或者使用dplyr,在col.2 上使用distinct,然后使用select 'col.1'

    library(dplyr)
    df %>%
       distinct(col.2, .keep_all = TRUE) %>%
       select(col.3 = col.1)
    #  col.3
    #1     1
    #2     1
    #3     1
    #4     2
    #5     2
    

    如果根据相邻元素的相等性考虑重复,则使用rleid

    library(data.table)
    df %>% 
        filter(!duplicated(rleid(col.2))) %>% 
        select(col.3 = col.1)
    

    如果我们转换为data.tableunique 也有一个by 选项

    library(data.table)
    unique(setDT(df), by = 'col.2')[, .(col.3 = col.1)]
    

    数据

    df <- structure(list(col.1 = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), col.2 = c(1L, 
    3L, 7L, 7L, 12L, 14L, 14L)), class = "data.frame", row.names = c(NA, 
    -7L))
    

    【讨论】:

    • 谢谢@akrun。出于某种原因,这仍然无法给我一套完整的col.1 值。我会尝试用真实数据添加一个可重现的例子
    • @JKO 如果是字符类,请检查您的值是否有尾随/前导空格
    • @JKO 另外,请使用dput 来显示数据,因为它将给出数据的结构
    • 我不确定你的意思
    • 我很抱歉!它确实有效!我的错误是我还在运行我设计的代码,用于将 col.3 与来自 col.2 的唯一值(我使用 col.4 &lt;- count(data,'col.2') 获得)拼接在一起。当我使用cbind(col.4, col.3) 执行此操作时,我得到了col.3 的截断版本
    猜你喜欢
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多