我有一個由數字和非數字列組成的數據框。字符和數字的數據框中的子集字符列
我想提取(子集)只有非數字列,所以字符的。雖然我能夠使用字符串將數字列子集:sub_num = x[sapply(x, is.numeric)]
,但我無法使用is.character
表單進行相反的操作。誰能幫我?
我有一個由數字和非數字列組成的數據框。字符和數字的數據框中的子集字符列
我想提取(子集)只有非數字列,所以字符的。雖然我能夠使用字符串將數字列子集:sub_num = x[sapply(x, is.numeric)]
,但我無法使用is.character
表單進行相反的操作。誰能幫我?
好吧,我對我的想法做了一個簡短的嘗試。
我可以確認的是,下面的代碼片段工作:
str(d)
'data.frame': 5 obs. of 3 variables:
$ a: int 1 2 3 4 5
$ b: chr "a" "a" "a" "a" ...
$ c: Factor w/ 1 level "b": 1 1 1 1 1
# Get all character columns
d[, sapply(d, class) == 'character']
# Or, for factors, which might be likely:
d[, sapply(d, class) == 'factor']
# If you want to get both factors and characters use
d[, sapply(d, class) %in% c('character', 'factor')]
使用正確的類,你sapply
-approach的sapply
功能之前,應該工作爲好,至少只要您插入缺失,
。
使用!is.numeric
不規模非常好,如果你有不組numeric, factor, character
中屬於類(一個我經常用的是POSIXct
,例如)的方法
R,數據和木工(我父親的交易)是關於工作的最佳工具。我同意'!is.numeric'對於'POSIXct'等不起作用,但是根據OPs參數,'!is.numeric'方法是最快的,而且鍵入的次數稍少。 –
嘗試:
x[sapply(x, function(x) !is.numeric(x))]
因爲它會拉動任何不是數字的因素和特徵。
編輯:
x <- data.frame(a=runif(10), b=1:10, c=letters[1:10],
d=as.factor(rep(c("A", "B"), each=5)),
e=as.Date(seq(as.Date("2000/1/1"), by="month", length.out=10)),
stringsAsFactors = FALSE)
# > str(x)
# 'data.frame': 10 obs. of 5 variables:
# $ a: num 0.814 0.372 0.732 0.522 0.626 ...
# $ b: int 1 2 3 4 5 6 7 8 9 10
# $ c: chr "a" "b" "c" "d" ...
# $ d: Factor w/ 2 levels "A","B": 1 1 1 1 1 2 2 2 2 2
# $ e: Date, format: "2000-01-01" "2000-02-01" ...
x[sapply(x, function(x) !is.numeric(x))]
嗨泰勒!我試過你的代碼,但它不起作用,因爲我錯誤地沒有檢查列是因素而不是字符。但是..從這個謝謝你的幫助! – Elb
這不是問題,因爲這會發現字符和因素,實際上不是數字,這是Thilo和我正在討論的問題。查看我的編輯。 –
其他以前的答案是沒有說清楚。所以我發佈了這個方法。爲了獲得該字符列的名稱,你可以做以下的事情:
chrs <- sapply(df_data, is.character)
chrCols <- names(df_data[, chrs])
使用@泰勒例
x <- data.frame(a=runif(10), b=1:10, c=letters[1:10],
d=as.factor(rep(c("A", "B"), each=5)),
e=as.Date(seq(as.Date("2000/1/1"), by="month", length.out=10)),
stringsAsFactors = FALSE)
In Base R
base::Filter(Negate(is.numeric),x)
c d e
1 a A 2000-01-01
2 b A 2000-02-01
3 c A 2000-03-01
4 d A 2000-04-01
5 e A 2000-05-01
6 f B 2000-06-01
7 g B 2000-07-01
8 h B 2000-08-01
9 i B 2000-09-01
10 j B 2000-10-01
也許你可以張貼至少STR(X)'爲'子集我們。這樣我們就可以看到發生了什麼。 – Thilo
作爲第一個猜測:你的人物列可能是因素嗎? – Thilo
嗨Thilo,抱歉沒有發佈str(x)。正如你正確地建議我,字符列是因素!我錯誤地沒有檢查過它。我試圖運行你發佈的字符串,它完美的工作!非常感謝你!!!!!! – Elb