R--去重unique ; duplicated,根據某一列的重復值,去除該重復值所在的整行

unique

語法

unique(x, incomparables = FALSE, fromLast = FALSE,
nmax = NA...)

x 可以是向量、數據框、數組array

incomparables FALSE meaning that all values can be compared.所有的值都可以進行比較

fromLast (from the last) TRUE即保留最后一個,默認是FALSE 保留第一個。(這倆行名是不同的)

nmax : the maximum number of unique items expected (greater than one)

例子
#使用help文檔里的例子看看
> x <- c(3:5, 11:8, 8 + 0:5)
> x
 [1]  3  4  5 11 10  9  8  8  9 10 11 12 13
> class(x)
[1] "numeric"
> (ux <- unique(x)) #fromLast默認FALSE,則重復值保留第一個
[1]  3  4  5 11 10  9  8 12 13
> (u2 <- unique(x, fromLast = TRUE))#重復值保留最后一個,與上面的結果,順序是不一樣的
[1]  3  4  5  8  9 10 11 12 13

新建一個數據框,試試

> df <- data.frame(gene = paste0('gene',c(1,2,3,2)),
+                  sam = paste0('sample',c(1,2,3,2)),
+                  exp = c(32,45,32,45))
> df #第2行于第4行是相同的,第1行和第3行只有exp相同
   gene     sam exp
1 gene1 sample1  32
2 gene2 sample2  45
3 gene3 sample3  32
4 gene2 sample2  45
> unique(df) #按 行 去 重
   gene     sam exp
1 gene1 sample1  32
2 gene2 sample2  45
3 gene3 sample3  32
> unique(df,fromLast = TRUE)
   gene     sam exp
1 gene1 sample1  32
3 gene3 sample3  32
4 gene2 sample2  45

上述可以看到,unique去重是一整行完全相同,然后把整行去掉。

如果有這么一個需求,根據某一列的重復值,去除該重復值所在的整行。(麻煩且有局限,可使用duplicated)

如上述例子里的 exp 列,按照要求,應該就剩下2行,第一行和第二行(fromlast默認值)

實現如下:

#先找出不重復的行。然后按照行名取一整行
> unique(df['exp'])
  exp
1  32
2  45
##這里是想直接取,但是報錯,因為unique(df['exp'])根本不是數字(表示哪一行的數字)
> df[unique(df['exp']),]
Error in xj[i] : invalid subscript type 'list'

#當行數較少的時候,可以直接把行輸入
> df[c(1,2),]
   gene     sam exp
1 gene1 sample1  32
2 gene2 sample2  45

#當行數多時,思路:先把行名提出來(行名未設置,是數字),結果以list形式返回,需要轉換成numeric
> rows <- rownames(unique(df['exp']))
> rows
[1] "1" "2"
> class(rows)
[1] "character"
> rows2 <- as.numeric(rows)
> rows2
[1] 1 2
> class(rows2)
[1] "numeric"
> df[rows2,]
   gene     sam exp
1 gene1 sample1  32
2 gene2 sample2  45

duplicated

語法

duplicated(x, incomparables = FALSE,
fromLast = FALSE, nmax = NA, ...)

參數解釋,同unique

判定重復元素,返回邏輯值

For a vector input, a logical vector of the same length as x. For a data frame, a logical vector with one element for each row.(x是向量,返回的邏輯向量與x長度相同;x是數據框,每行返回一個邏輯值)

例子
> x
 [1]  3  4  5 11 10  9  8  8  9 10 11 12 13
> duplicated(x)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE

> df #第2行于第4行是相同的,第1行和第3行只有exp相同
   gene     sam exp
1 gene1 sample1  32
2 gene2 sample2  45
3 gene3 sample3  32
4 gene2 sample2  45
> duplicated(df)
[1] FALSE FALSE FALSE  TRUE #第4行是重復值

去重,使用 !

#duplicated可以放在[]中,因為是邏輯值
> xu <- x[!duplicated(x)]
> xu
[1]  3  4  5 11 10  9  8 12 13
# 與unique結果是一樣的

數據框與向量有所不同,[]中不能只放duplicated,而是應該放在 行的位置,取“TRUE”的行,右邊 列 的位置為空

> dfu <- df[!duplicated(df)]#這樣沒有用
> dfu
   gene     sam exp
1 gene1 sample1  32
2 gene2 sample2  45
3 gene3 sample3  32
4 gene2 sample2  45
> dfu <- df[!duplicated(df),]
> dfu
   gene     sam exp
1 gene1 sample1  32
2 gene2 sample2  45
3 gene3 sample3  32

根據某一列的重復值,去除該重復值所在的整行

嗯,干凈利落。

> dfuexp <- df[!duplicated(df$exp),]
> dfuexp
   gene     sam exp
1 gene1 sample1  32
2 gene2 sample2  45

保存篩選過后的數據

#保存為文本

write.table(寫入的數據名字,file = '輸出文件的名字,txt',sep = '分隔符')

#保存為逗號分割文本

write.csv(寫入的數據名字,file = '輸出文件的名字.csv')

#保存為R格式文件

save(output1,file = 'output1.RData')

以 writer.table 為例

write.table(shh_dxs_unique,file = 'shh_dxs_unique.txt',sep = '\r\n',row.names = FALSE,col.names = FALSE,quote = FALSE)
  • shh_dxs_unique 是清理過的數據
  • shh_dxs_unique.txt 是輸出文件的名字,儲存在工作目錄下
  • \r\n,windows 下的換行符
  • row.names = FALSE,col.names = FALSE 不輸出行名列名(這個因需求而異)
  • quote = FALSE 輸出的字符串不加引號(不加這個參數,輸出的每一行都會有引號)
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。