![](/img/trans.png)
[英]Trying to keep values of a column based on the unique values of two other columns
[英]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
從錯誤看,它看起來像是生成列之間差異的向量,而不是元素之間的差異......
編輯:新增z
和a
最后一排的樣本數據。
您可以使用基數R中的setdiff
和Reduce
來執行此操作:
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.