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 輸出的字符串不加引號(不加這個參數,輸出的每一行都會有引號)