首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将字符串函数应用于列?

如何将字符串函数应用于列?
EN

Stack Overflow用户
提问于 2017-03-18 19:33:50
回答 2查看 57关注 0票数 2

我有一些数据显示如下

代码语言:javascript
运行
复制
        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

bed.bath列是一个character。我想分别提取关于床和浴的信息。我试着拆分字符串并提取出如下的数字

代码语言:javascript
运行
复制
getbeds <- function(x){

  splits = strsplit(x," ")

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

但是,当我使用df<- df%>% mutate(beds = getbeds(bed.bath))时,新列仅为1s。

代码语言:javascript
运行
复制
        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

从我的数据框架中提取我喜欢的信息的最好方法是什么?

数据

代码语言:javascript
运行
复制
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))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-18 19:44:34

我们可以使用来自extracttidyr

代码语言:javascript
运行
复制
library(tidyr)
library(dplyr)
df %>% 
   extract(bed.bath, into = 'beds', "(\\d+).*", remove = FALSE)

或者使用base R,使用sub匹配一个或多个空格(\\s+),后面跟着字符(.*),并将其替换为空格,以便在字符串开头得到数字,并删除所有其他字符。

代码语言:javascript
运行
复制
df$beds <- with(df, as.integer(sub("\\s+.*", "", bed.bath)))

OP输出值相同的原因是它只从第一个list元素([[1]])中提取第一个观测值([[1]])

票数 4
EN

Stack Overflow用户

发布于 2017-03-18 20:24:39

如果还想提取浴室的数量,可以使用:

代码语言:javascript
运行
复制
 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42878925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档