2017-03-18 16 views
2

Iは、bed.bath列がcharacterある列に文字列関数を適用するにはどうすればよいですか?

 date   over  bed.bath 
1 2016-03-17 -0.002352941 1 bed 1 bath 
2 2016-03-17 -0.035294118 1 bed 1 bath 
3 2016-03-17 -0.008278717 1 bed 1 bath 
4 2016-03-17 -0.008350731 1 bed 1 bath 
5 2016-03-17 0.004243281 1 bed 2 bath 
6 2016-03-17 0.007299270 2 bed 2 bat 

、以下に示すいくつかのデータを持っています。私はベッドとバスについての情報を別々に抽出したいと思います。私は、文字列を分割し、私はdf<- df%>% mutate(beds = getbeds(bed.bath))を使用する場合、しかし、そう

getbeds <- function(x){ 

    splits = strsplit(x," ") 

    return(splits[[1]][1]) 
} 

のような数字を抽出しようとした、新しい列がちょうど1秒です。

 date   over  bed.bath beds 
1 2016-03-17 -0.002352941 1 bed 1 bath 1 
2 2016-03-17 -0.035294118 1 bed 1 bath 1 
3 2016-03-17 -0.008278717 1 bed 1 bath 1 
4 2016-03-17 -0.008350731 1 bed 1 bath 1 
5 2016-03-17 0.004243281 1 bed 2 bath 1 
6 2016-03-17 0.007299270 2 bed 2 bath 1 

私のデータフレームから好きな情報を抽出する最良の方法は何ですか?

データ

df <- structure(list(date = structure(c(16877, 16877, 16877, 16877, 16877, 16877), class = "Date"), 
        over = c(-0.002352941, -0.035294118, -0.008278717, -0.008350731, 0.004243281, 0.00729927), 
        bed.bath = c("1 bed 1 bath", "1 bed 1 bath", "1 bed 1 bath", "1 bed 1 bath", "1 bed 2 bath", "2 bed 2 bath")), 
       .Names = c("date", "over", "bed.bath"), 
       row.names = c("1", "2", "3", "4", "5", "6"), class = "data.frame") 

library('dplyr') 
df %>% mutate(beds = getbeds(bed.bath)) 
+1

'return(sapply(split、\' [\ '、1L))'? – rawr

+0

@rawrありがとうございました。 –

答えて

4

私たちは、文字(.*)に続いて1つ以上のスペース(\\s+)と一致して交換するtidyr

library(tidyr) 
library(dplyr) 
df %>% 
    extract(bed.bath, into = 'beds', "(\\d+).*", remove = FALSE) 

またはsubを使用してbase Rとからextractを使用することができますそれは空白で始まり、文字列の先頭にある数字をすべて取得します。他の文字は削除されます。

df$beds <- with(df, as.integer(sub("\\s+.*", "", bed.bath))) 

あなたはまた、抽出したい場合は、最初list要素([[1]]

+1

偉大な、私はまだ学んでいます。助けをありがとう –

+1

抽出物を使ってベッドと浴の両方のカラムを得るには、 'extract(bed.bath、into = c("ベッド "、"入浴 ")、"(\\ d +)\\ s。* \\ d +)\\ s。* ")' – Sharon

1

からのみ最初の観測([1])を抽出しているためOPの出力に同じ値の理由はあなたはサプリを使用することができます:

getbeds <- function(x){ 

    splits = strsplit(x," ") 

    as.integer(c(splits[[1]][[1]],splits[[1]][[3]])) 
} 

bed.bath <- t(sapply(df$bed.bath,getbeds)) 

getbeds <- function(x){ 

    splits = strsplit(x," ") 

    c(splits[[1]][[1]],splits[[1]][[3]]) 
} 

bed.bath <- t(sapply(df$bed.bath,getbeds)) 

df$bed <- bed.bath[,1] 
df$bath <- bed.bath[,2] 

df 
#  date   over  bed.bath bed bath 
#1 2016-03-17 -0.002352941 1 bed 1 bath 1 1 
#2 2016-03-17 -0.035294118 1 bed 1 bath 1 1 
#3 2016-03-17 -0.008278717 1 bed 1 bath 1 1 
#4 2016-03-17 -0.008350731 1 bed 1 bath 1 1 
#5 2016-03-17 0.004243281 1 bed 2 bath 1 2 
関連する問題