楼主: 阿璇tian
7866 15

[问答] R语言怎么根据空格把一个变量拆成两个变量 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

89%

还不是VIP/贵宾

-

威望
0
论坛币
8 个
通用积分
2.8713
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1959 点
帖子
121
精华
0
在线时间
195 小时
注册时间
2017-12-21
最后登录
2023-3-27

楼主
阿璇tian 发表于 2018-11-15 16:41:41 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
老师们好,我刚用R清理数据,用起来觉得不如stata方便,是我水平的原因吗?

我有一个小问题,我想把checktime这个变量按照空格分割成两个变量,我用了strsplit,结果出来不对
dk$a<- unlist(split(dk$checktime," "))


请问这句话用R怎么实现呢?
万份感谢~ 1.png
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:R语言 split check Stata time

沙发
阿璇tian 发表于 2018-11-15 16:55:53
  1. a<- strsplit(dk$checktime," ")
  2. date<- sapply(a,"[",1)
  3. time<- sapply(a,"[",2)
  4. dk<- as.data.frame(cbind(dk,date,time))
复制代码


我用了一个笨办法实现了

藤椅
阿璇tian 发表于 2018-11-15 17:55:31
  1. dk<- read.csv2("mm.csv",header=TRUE,sep=",",stringsAsFactors=FALSE)  
  2. str(dk)
  3. a<- strsplit(dk$checktime," ")
  4. date<- as.Date(sapply(a,"[",1))
  5. dk$checktime<- strptime(as.character(sapply(a,"[",2)),"%H:%M")
  6. dk<- as.data.frame(cbind(dk,date))
  7. dk<- dk[order(dk$userid,dk$date),-4]

  8. #dk$time<- strptime(dk$t,"%H:%M:%S")
  9. dk$t<- ifelse(format(dk$checktime,"%H:%M:%S")<="12:00:00",0,1)
  10. dk_qch<- dk %>% group_by(userid,date,t) %>% filter(row_number() == 1) %>% ungroup()
复制代码



老师,我这么写的,最后一步,想按照userid date t,分组,去重,结果最后一句报错了

Error in grouped_df_impl(data, unname(vars), drop) :
  Column `checktime` is of unsupported class POSIXlt/POSIXt

这里我没用道checktime这个变量,为啥会报checktime的错呢?

板凳
Whig 在职认证  发表于 2018-11-15 18:03:36
你那一列是个时间列,完全可以按时间提取吧,当成字符串根据空格分隔反而不方便了

报纸
cheetahfly 在职认证  发表于 2018-11-15 18:24:25
  1. install.packages("hms")
  2. library(tidyverse)
  3. library(lubridate)
  4. data.frame(a = now() + 1:10) %>%
  5.   mutate(x = as.Date(x),
  6.          y = hms::as.hms(x))
复制代码

已有 1 人评分论坛币 收起 理由
jiangbeilu + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

地板
阿璇tian 发表于 2018-11-16 09:35:13
cheetahfly 发表于 2018-11-15 18:24
老师,我跑这句话,显示

Error in now() : could not find function "now"

7
阿璇tian 发表于 2018-11-16 10:20:04
  1. dk<- read.csv2("mm.csv",header=TRUE,sep=",",stringsAsFactors=FALSE)[,-4]  
  2. str(dk)
  3. dk$checktime<- strptime(dk$checktime,"%Y/%m/%d %H:%M")
  4. dk$t<- ifelse(format(dk$checktime,"%H:%M:%S")<="12:00:00",0,1)
  5. dk$date<- format(dk$checktime,"%Y-%m-%d")
  6. dk<- dk[order(dk$userid,dk$date),-1]
  7. dk_qch<- dk %>% group_by(userid,date,t) %>% filter(row_number() == 1) %>% ungroup()
  8. dk_qch$time<- 0.5
  9. dk_wide<-dcast(dk_qch,username+userid~date+t,value.var = 'time')
复制代码


老师们,我用这几句实现了,可能还不是最简单的写法,
和我用stata写的对比了一下,R写起来比stata简便啊!

8
EMUNAH777 发表于 2018-11-16 11:35:02
我假设你只是想做一个分割
如果那个原本是在一个数据框里的数据,原本那一列的格式需要先转化成向量再分割,否则用字符分割都会报错的,所以输入到一个中间变量比如tm
>tm <- strsplit(as.vector(你的数据框名[["你的需处理列名"]]), "")   
但是目前tm应该是列表格式,我假设你想做成和原来一样的两个竖列,能粘贴或者替换到原来表格的,
>tm <- do.call(rbind, tm)
这样子它的格式就发生了转换,变成了data.frame格式,而且是两个竖列,这样子保存值都是字符,如果希望以时间保存参考下面再做一次转换,或者一开始就提取时间之后再分割

9
EMUNAH777 发表于 2018-11-16 12:48:09
但是这样子分割的话,就不能保存为一个完整的时间变量了。
年月日可以用as.Date保存为时间变量,单独的小时分和秒可以用上面朋友提到的hms包。

具体可以先把时间用tm1 <- strptime(你的表格[[“你的时间列”]],  format = "%Y/%m/%e %H :%M", tz = "GMT")提取出来   然后as.data.frame(as.Date(tm1))提取年月日并且保存为表格格式,as.data.frame(as.hms(tm1, tz = "GMT"))提取时分秒并且保存为表格格式,把表格列名改一下,注意一定要写时区参数,否则结果可能会+8小时


10
cheetahfly 在职认证  发表于 2018-11-16 13:47:07
阿璇tian 发表于 2018-11-16 09:35
老师,我跑这句话,显示

Error in now() : could not find function "now"
疏忽了,lubridate::now()

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-5 16:14