2012-05-12 47 views
3

我有一个由数字和非数字列组成的数据框。字符和数字的数据框中的子集字符列

我想提取(子集)只有非数字列,所以字符的。虽然我能够使用字符串将数字列子集:sub_num = x[sapply(x, is.numeric)],但我无法使用is.character表单进行相反的操作。谁能帮我?

+0

也许你可以张贴至少STR(X)'为'子集我们。这样我们就可以看到发生了什么。 – Thilo

+1

作为第一个猜测:你的人物列可能是因素吗? – Thilo

+0

嗨Thilo,抱歉没有发布str(x)。正如你正确地建议我,字符列是因素!我错误地没有检查过它。我试图运行你发布的字符串,它完美的工作!非常感谢你!!!!!! – Elb

回答

1

好吧,我对我的想法做了一个简短的尝试。

我可以确认的是,下面的代码片段工作:

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,例如)的方法

+1

R,数据和木工(我父亲的交易)是关于工作的最佳工具。我同意'!is.numeric'对于'POSIXct'等不起作用,但是根据OPs参数,'!​​is.numeric'方法是最快的,而且键入的次数稍少。 –

0

尝试:

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))] 
+0

嗨泰勒!我试过你的代码,但它不起作用,因为我错误地没有检查列是因素而不是字符。但是..从这个谢谢你的帮助! – Elb

+0

这不是问题,因为这会发现字符和因素,实际上不是数字,这是Thilo和我正在讨论的问题。查看我的编辑。 –

0

其他以前的答案是没有说清楚。所以我发布了这个方法。为了获得该字符列的名称,你可以做以下的事情:

chrs <- sapply(df_data, is.character) 
chrCols <- names(df_data[, chrs]) 
0

使用@泰勒例

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 
相关问题