簡體   English   中英

兩列之間的唯一值列

[英]column of unique values between of two other columns

樣本數據:

col1    col2
<NA>    cc
a       a
ab      a
z       a

我想添加一個與這些值unique的列 - 任何在col1和col2之間不共享的值。

col1    col2    unique
<NA>    cc      cc
a       a   
ab      a       b
z       a       za 

我試過用setdiff但是

(用於復制目的:)

df <- read.table(header=TRUE, stringsAsFactors = FALSE, text = 
                   "col1    col2
    NA  cc
                 a      a
                 ab     a
                 z      a
                 ")

像這樣:

df$unique <- paste0(setdiff(df$col1, df$col2), setdiff(df$col2, df$col1))

但它回來了

Error in `$<-.data.frame`(`*tmp*`, "unique", value = c("<NA>cc", "abcc" : 
  replacement has 2 rows, data has 3

從錯誤看,它看起來像是生成列之間差異的向量,而不是元素之間的差異......

編輯:新增za最后一排的樣本數據。

您可以使用基數R中的setdiffReduce來執行此操作:

cols <- c(1,2)    
df$unique <- unlist(lapply(apply(df[cols], 1, function(x) 
                  Reduce(setdiff, strsplit(na.omit(x), split = ""))), paste0, collapse=""))

  # col1 col2 unique
# 1 <NA>   cc     cc
# 2    a    a       
# 3   ab    a      b

這是一個帶有apply的長度方法。

apply(df, 1, function(i) {
              i <- i[!is.na(i)] # remove NAs
              if(length(i[!is.na(i)]) == 1) i # check length and return singletons untouched
              else { # for non-singletons
                i <- unlist(strsplit(i, split="")) # strsplit and turn into a vector
                i <- i[!(duplicated(i) | duplicated(i, fromLast=TRUE))] # drop duplicates
                paste(i, collapse="")}}) # return collapsed singleton set of characters
[1] "cc" ""   "b" 

請注意,對於c(“cc”,“a”,“c”),這將返回“a”,因為“cc”和“c”將被標記為重復。

我們需要先拆分字符串:

df$unique <- mapply(function(x, y){
    u <- setdiff(union(x, y), intersect(x, y))
    paste0(u[!is.na(u)], collapse = '')
}, strsplit(df$col1, ''), strsplit(df$col2, ''))

# >df
#   col1 col2 unique
# 1 <NA>   cc      c
# 2    a    a       
# 3   ab    a      b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM