2015-09-25 85 views
0

因此,這有點奇怪,我對R很新,面臨這個奇怪的問題。 我有一個數據框,並且有一個名爲SNDATE的列,它是兩個不同列的組合值。如何搜索數據中的特定列名稱

我想檢查數據幀是否有一個名爲SN的列,如果沒有,我會拆分SNDATE來填充SN列。

下面是代碼

if(!('SN' %in% colnames(data))){ 
    #do some spliting here 
} 

有趣的是,它口口聲聲說它的存在,並在它的東西永遠不會被觸發。 而當我這樣做:

print(data$SN) 

它將打印data$SNDATE值。那麼R是否有某種懶惰的名字填充?這對我來說很奇怪。

非常感謝您的幫助

回答

2

當你

print(data$SN) 

它的作品,因爲$使用部分名稱匹配。再如,嘗試

mtcars$m 

沒有名爲m列,因此$部分匹配mpg。不幸的是,這不是在%in%用,所以你需要使用完整確切的列名在

if(!('SNDATE' %in% colnames(data))){ 
    #do some spliting here 
} 

你可以INSEAD沿pmatch()

names(mtcars)[2] <- "SNDATE" 
names(mtcars)[pmatch("SN", names(mtcars))] 
# [1] "SNDATE" 

線使用的東西,所以if()語句可能去這樣的事情 -

nm <- colnames(data) 
if(!nm[pmatch("SN", nm)] %in% nm) { 
    ... 
} 

甚至

if(is.na(pmatch("SN", names(data))) 

可能會更好

+0

這是我的問題,我要檢查,如果SN是在數據幀。 R繼續說是,因爲SNDATE在那裏,所以在那裏。 –

+0

它不會說「是的,它是一個列的名稱」,它部分匹配列名稱,併爲您提供該列。您想做什麼?你想在'%in%'調用中使用'SN'嗎? –

+0

嗯沒關係。雅部分匹配的東西對我來說是全新的,並且不知何故讓我覺得這是安靜的危險的事情:x我需要使if語句來檢查列SN,所以我知道是否需要分割SNDATE來填充它起來。我會嘗試以上的答案。感謝您的幫助! –