R 字符和数字数据框中的字符列子集

R 字符和数字数据框中的字符列子集,r,dataframe,R,Dataframe,我有一个由数字列和非数字列组成的数据框 我只想提取(子集)非数字列,所以字符列。虽然我能够使用字符串对数值列进行子集化: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"

我有一个由数字列和非数字列组成的数据框


我只想提取(子集)非数字列,所以字符列。虽然我能够使用字符串对数值列进行子集化:
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
-方法也应该有效,至少只要您在
sapply
函数之前插入缺少的

使用
的方法!is.numeric如果您的类不属于组
numeric、factor、character
(例如,我经常使用的类是
POSIXct
),则无法很好地进行缩放)

尝试:

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))]
x str(x)
#“data.frame”:10个obs。共有5个变量:
#$a:num 0.8140.3720.7320.5220.626。。。
#$b:int 1 2 3 4 5 6 7 8 9 10
#$c:chr“a”“b”“c”“d”。。。
#$d:系数w/2级“A”、“B”:1 2
#$e:日期,格式:“2000-01-01”“2000-02-01”。。。
x[sapply(x,函数(x)!is.numeric(x))]

前面的其他答案并不那么清楚。所以我发布了这个方法。要获取字符列的名称,可以执行以下操作:

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

chrs使用@Tyler示例

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

x如果您试图只选择字符列,可以使用
dplyr::select_If()
is.character()
来完成。以
dplyr::starwars
示例数据为例:

library(dplyr)
starwars %>% 
  select_if(is.character) %>% 
  head(2)
# A tibble: 2 x 7
  name           hair_color skin_color eye_color gender homeworld species
  <chr>          <chr>      <chr>      <chr>     <chr>  <chr>     <chr>  
1 Luke Skywalker blond      fair       blue      male   Tatooine  Human  
2 C-3PO          NA         gold       yellow    NA     Tatooine  Droid 
库(dplyr)
星战%>%
如果(是.字符)%>%,请选择_%
总目(2)
#一个tibble:2x7
名字头发颜色皮肤颜色眼睛颜色性别家庭世界物种
1卢克·天行者金发碧眼男性塔图因人
2 C-3PO NA金黄色NA塔图因机器人
或者,如果您试图否定某个列类型,请注意语法略有不同:

starwars %>%  
  select_if(~!is.numeric(.)) %>% 
  head(2)

# A tibble: 2 x 10
    name           hair_color skin_color eye_color gender homeworld species films     vehicles  starships
    <chr>          <chr>      <chr>      <chr>     <chr>  <chr>     <chr>   <list>    <list>    <list>   
  1 Luke Skywalker blond      fair       blue      male   Tatooine  Human   <chr [5]> <chr [2]> <chr [2]>
  2 C-3PO          NA         gold       yellow    NA     Tatooine  Droid   <chr [6]> <chr [0]> <chr [0]>
starwars%>%
如果(~!是.numeric(.))%>%,请选择
总目(2)
#一个tibble:2x10
名字头发颜色皮肤颜色眼睛颜色性别家园物种电影交通工具星际飞船
1卢克·天行者金发碧眼男性塔图因人
2 C-3PO NA金黄色NA塔图因机器人

也许您可以为我们发布至少一部分
str(x)
。这样我们就可以看到发生了什么。作为第一个猜测:你的字符列实际上可能是因素吗?嗨,Thilo,很抱歉没有发布str(x)。正如你正确地建议我的,字符列是因素!!我错了,以前没有检查过。我试着运行你发布的字符串,它工作得很好!!非常感谢你!!!!!!如果它像预期的那样工作,你可以接受你得到的答案之一,意思是泰勒的或我的。您可以通过单击答案旁边的复选标记来完成此操作。通过这种方式,更多的问题访问者可以看到是什么解决了你的问题。此外,给出答案的人会获得少量的声誉(随着时间的推移,这会给你一些特权,但这是Stackoverflow常见问题解答的一部分)。有了R、stats和carpentry(我父亲的行业),这大概是做这项工作的最佳工具。我同意!is.numeric
不适用于
POSIXct
等。但是根据OPs参数,
!is.numeric
方法速度最快,输入量略少。嗨,泰勒!我尝试了你的代码,但它不起作用,因为我错误地没有检查列是否是因子而不是字符。除此之外,谢谢你的帮助!这不是问题所在,因为这会发现性格和因素,事实上,任何不是数字的东西,这就是蒂洛和我讨论的问题。查看我的编辑。