【问题标题】:Sum of first n-Numbers in string in R separated by Underline BarR中字符串中前n个数字的总和,用下划线分隔
【发布时间】:2019-01-07 14:30:45
【问题描述】:

我目前正在处理一项旅行调查的数据。旅游信息以奇怪的字符串格式给出:

tours <- c("Home_work_service_leisure_business_leisure_Home", "Home_service_work_Home", "Home_leisure_shopping_leisure_education_Home")
distance <-  c("0_1.7_0.5_2.4_0.8_1.8_0", "0_5.2_7_0", "0_2.8_3_0.2_1.9_0")
primary_act <-  c(1, 2, 4)
# "home" is not considered an activity and thus it is activity zero. 

Travel_survey <- data.frame(tours, distance , primary_act)

我想从这些数据中提取到主要活动的总距离。这意味着我想总结工作或教育之前的行程距离。 所以在我们的例子中,结果应该是:

Travel_survey$distance_primact <- c(0.17, 12.2, 7.9)

我设法做的是拆分距离字符串并对值求和。但是,我想告诉函数只对第一个 n 值求和,而 n 等于 primary_act。

sapply(strsplit(as.character(Travel_survey$distance), "_"),
       function(x) sum(as.numeric(x), na.rm=TRUE))

有没有人知道如何做到这一点?如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 不清楚你是如何获得distance_primact的。你能举个例子吗?第一行是“0.17”吗?
  • 第一个应该是0 + 1.7 = 1.7 ...对吧?
  • 这是正确的第一个是 0+1.7

标签: r regex split


【解决方案1】:

给你:

library(magrittr)
touri<-Travel_survey$tours %>% as.character %>% strsplit(.,"_")
disti<-Travel_survey$distance %>% as.character %>% strsplit(.,"_") %>% lapply(.,as.numeric)

touri<-lapply(touri,function(x) { 1:grep(pattern="(?i)work|education",x) })

mapply(function(d,nums){sum(d[nums],na.rm=F)},d=disti,nums=touri)
#[1]  1.7 12.2  7.9

请注意:

您当然可以从这些原始数据中减去primary_act。这一步在您的问题中仍不清楚。

Travel_survey$distance_primact <- mapply(function(d,nums){sum(d[nums],na.rm=F)},d=disti,nums=touri) - primary_act

【讨论】:

  • 感谢您的帮助。但是,我无法用 grep 识别 touri,因为有这样的旅行:"Home_work_service_leisure_education_leisure_Home" 如果工作或教育是主要活动,则取决于某些人的规范。这就是为什么必须通过primary_act 以某种方式识别主要活动的原因
  • “当然要从这些原始数据中减去primary_act”。怎么样?
  • 使用- 运算符。
猜你喜欢
  • 2013-09-20
  • 2018-09-28
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多