以下面的資料框為例。我需要通過僅保留過濾器物件中的列來更改資料框。
test <- data.frame(A = c(1,6,1,2,3) , B = c(1,2,1,1,2), C = c(1,7,6,4,1), D = c(1,1,1,1,1))
filter <- c("A", "B", "C", "D")
filter2 <- c("A","B","D")
為此,我正在使用這段代碼:
`%ni%` <- Negate(`%in%`)
test <- test[,-which(names(test) %ni% filter2)]
如果我使用filter2物件,我會得到預期的結果:
A B D
1 1 1 1
2 6 2 1
3 1 1 1
4 2 1 1
5 3 2 1
但是,如果我使用過濾器物件,我會得到一個包含零列的資料框:
data frame with 0 columns and 5 rows
我希望得到一個未觸及的資料框,因為過濾器中包含所有測驗列。為什么會發生這種情況,在這些情況下,我如何撰寫更可靠的代碼來不獲取空資料幀?
uj5u.com熱心網友回復:
使用!代替-
test[,!(names(test) %ni% filter2)]
test[,!(names(test) %ni% filter)]
which通過 with和 using包裝-,它僅在lengthof 的輸出which大于 0時才有效
> which(names(test) %ni% filter2)
[1] 3
> which(names(test) %ni% filter)
integer(0)
通過這樣做,情況-沒有變化integer(0)
> -which(names(test) %ni% filter)
integer(0)
> -which(names(test) %ni% filter2)
[1] -3
因此,
> test[integer(0)]
data frame with 0 columns and 5 rows
uj5u.com熱心網友回復:
我認為您可以通過使用列名的字符向量對資料框進行子集化來簡化列選擇程序。
test[filter]
# A B C D
#1 1 1 1 1
#2 6 2 7 1
#3 1 1 6 1
#4 2 1 4 1
#5 3 2 1 1
test[filter2]
# A B D
#1 1 1 1
#2 6 2 1
#3 1 1 1
#4 2 1 1
#5 3 2 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/412441.html
標籤:
