字符和日期变量
先查看各命令展开的示例,再按需展开其他选项及 R 实现。改写代码前,请阅读适用条件及差异说明。
char
从 ASCII 编码创建字符
Stata
generate z = char(code)R 包:base
data$z <- vapply(data$code,intToUtf8,character(1))与 Stata 有差异 仅限 ASCII 编码 1–127;扩展字节编码不是 Unicode 码点。
clock
把文本转换成日期时间
Stata
generate t = clock(s, "YMDhms")R 包:lubridate
mutate(data, t = lubridate::ymd_hms(s))与 Stata 有差异 R 使用 Date/POSIXct 或 tsibble 日历类别,而非 Stata 以 1960 年为起点的数值日期时间计数;交换底层数值须转换纪元和时区。
另有 1 个示例及替代实现
使用显式 UTC 时区解析日期时间
Stata
generate double z = clock(s, "YMDhms")R 包:base
data$z <- as.POSIXct(data$s,format='%Y-%m-%d %H:%M:%S',tz='UTC')与 Stata 有差异 POSIXct 是带时区的自 1970 年起的秒数;Stata clock 是不带时区的自 1960 年起的毫秒数。
cofd
将 R 日期转换为 Stata 午夜毫秒编码
Stata
generate double z = cofd(d)R 包:base
data$z <- as.numeric(data$d-as.Date('1960-01-01'))*86400000与 Stata 有差异 返回自 1960 年起的普通 Stata %tc 毫秒数,而非 POSIXct 对象。
date
把文本转换成日期
Stata
generate d = date(s, "YMD")R 包:lubridate
mutate(data, d = lubridate::ymd(s))与 Stata 有差异 R 使用 Date/POSIXct 或 tsibble 日历类别,而非 Stata 以 1960 年为起点的数值日期时间计数;交换底层数值须转换纪元和时区。
另有 3 个示例及替代实现
解析日月年日期字符串
Stata
generate z = date(s, "DMY")R 包:base
data$z <- as.Date(data$s,format='%d/%m/%Y')与 Stata 有差异 R Date 对象的数值原点不同于 Stata;请用对象进行日历操作,不直接比较原始编码。
解析月日年日期字符串
Stata
generate z = date(s, "MDY")R 包:base
data$z <- as.Date(data$s,format='%m/%d/%Y')与 Stata 有差异 R Date 对象的数值原点不同于 Stata;请用对象进行日历操作,不直接比较原始编码。
解析年月日日期字符串
Stata
generate z = date(s, "YMD")R 包:base
data$z <- as.Date(data$s,format='%Y-%m-%d')与 Stata 有差异 R Date 对象的数值原点不同于 Stata;请用对象进行日历操作,不直接比较原始编码。
day
另有 1 个示例及替代实现
提取月内日期编号
Stata
generate z = day(d)R 包:base
data$z <- as.integer(format(data$d,'%d'))与 Stata 有差异 接收 R Date 列并返回所示日历要素;原始 Stata 日期编码须先转换。
daysinmonth
获取各日历月的天数
Stata
generate z = daysinmonth(d)R 包:lubridate
data$z <- as.integer(lubridate::days_in_month(data$d))与 Stata 有差异 R Date 对象的数值原点不同于 Stata;请用对象进行日历操作,不直接比较原始编码。
display
dofc
将 Stata 毫秒日期时间转换为日期
Stata
generate z = dofc(milliseconds)R 包:base
data$z <- as.Date(as.POSIXct(data$milliseconds/1000,origin='1960-01-01',tz='UTC'),tz='UTC')与 Stata 有差异 用于不含闰秒编码的普通 Stata %tc 值;UTC 用于保证时区确定。
dofm
月度时期的第一天
Stata
generate d = dofm(m)R 包:tsibble
mutate(data, d = as.Date(m))与 Stata 有差异 这里的 m 是 tsibble::yearmonth() 生成的月度时期。 R 使用 Date/POSIXct 或 tsibble 日历类别,而非 Stata 以 1960 年为起点的数值日期时间计数;交换底层数值须转换纪元和时区。
另有 1 个示例及替代实现
将 Stata 月度编码转换为月初日期
Stata
generate z = dofm(m)R 包:base
data$z <- as.Date(sprintf('%04d-%02d-01',1960L+data$m%/%12L,data$m%%12L+1L))与 Stata 有差异 R Date 对象的数值原点不同于 Stata;请用对象进行日历操作,不直接比较原始编码。
dofq
将 Stata 季度编码转换为季度首日
Stata
generate z = dofq(q)R 包:base
data$z <- as.Date(sprintf('%04d-%02d-01',1960L+data$q%/%4L,(data$q%%4L)*3L+1L))与 Stata 有差异 R Date 对象的数值原点不同于 Stata;请用对象进行日历操作,不直接比较原始编码。
dofy
构建各年份首日
Stata
generate z = dofy(year)R 包:base
data$z <- as.Date(sprintf('%04d-01-01',data$year))与 Stata 有差异 R Date 对象的数值原点不同于 Stata;请用对象进行日历操作,不直接比较原始编码。
dow
星期几
Stata
generate w = dow(d)R 包:lubridate
mutate(data, w = lubridate::wday(d) - 1)wday() 把星期日记为 1;Stata 的 dow() 把星期日记为 0。
另有 1 个示例及替代实现
提取星期并以零表示星期日
Stata
generate z = dow(d)R 包:base
data$z <- as.integer(format(data$d,'%w'))与 Stata 有差异 接收 R Date 列并返回所示日历要素;原始 Stata 日期编码须先转换。
doy
提取年内日期编号
Stata
generate z = doy(d)R 包:base
data$z <- as.integer(format(data$d,'%j'))与 Stata 有差异 接收 R Date 列并返回所示日历要素;原始 Stata 日期编码须先转换。
firstdayofmonth
查找各日历月的首日
Stata
generate z = firstdayofmonth(d)R 包:base
data$z <- as.Date(format(data$d,'%Y-%m-01'))与 Stata 有差异 R Date 对象的数值原点不同于 Stata;请用对象进行日历操作,不直接比较原始编码。
format
generate
以年计的年龄或时长
Stata
generate age = (d2 - d1) / 365.25R 包:lubridate
mutate(data, age = lubridate::time_length(lubridate::interval(d1, d2), "years"))与 Stata 有差异 time_length(interval(…), “years”) 使用日历年长度;天数除以 365.25 是固定年长近似,年龄结果可能不同。
halfyear
提取半年编号
Stata
generate z = halfyear(d)R 包:base
data$z <- (as.integer(format(data$d,'%m'))-1L)%/%6L+1L与 Stata 有差异 接收 R Date 列并返回所示日历要素;原始 Stata 日期编码须先转换。
hh
从 UTC 时间戳提取小时
Stata
generate z = hh(t)R 包:base
data$z <- as.integer(format(data$t,'%H',tz='UTC'))与 Stata 有差异 输入为 R POSIXct 时间戳;原始 Stata %tc 数值需先转换再提取。
lower
转为小写
Stata
generate s = lower(name)R 包:stringr
mutate(data, s = str_to_lower(name))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
mdy
由年、月、日生成日期
Stata
generate d = mdy(m, d, y)R 包:lubridate
mutate(data, d = lubridate::make_date(y, m, d))与 Stata 有差异 R 使用 Date/POSIXct 或 tsibble 日历类别,而非 Stata 以 1960 年为起点的数值日期时间计数;交换底层数值须转换纪元和时区。
另有 1 个示例及替代实现
从年、月、日列构建日期
Stata
generate z = mdy(month, day, year)R 包:base
data$z <- as.Date(sprintf('%04d-%02d-%02d',data$year,data$month,data$day))与 Stata 有差异 R Date 对象的数值原点不同于 Stata;请用对象进行日历操作,不直接比较原始编码。
mm
从 UTC 时间戳提取分钟
Stata
generate z = mm(t)R 包:base
data$z <- as.integer(format(data$t,'%M',tz='UTC'))与 Stata 有差异 输入为 R POSIXct 时间戳;大写 %M 为分钟,小写 %m 为月份。
mofd
由日期生成月度时期
Stata
generate m = mofd(d)R 包:tsibble
mutate(data, m = tsibble::yearmonth(d))与 Stata 有差异 tsibble::yearquarter() 为季度版本,相当于 qofd()。 R 使用 Date/POSIXct 或 tsibble 日历类别,而非 Stata 以 1960 年为起点的数值日期时间计数;交换底层数值须转换纪元和时区。
另有 1 个示例及替代实现
将 Date 日期转换为 Stata 月度编码
Stata
generate z = mofd(d)R 包:base
data$z <- (as.integer(format(data$d,'%Y'))-1960L)*12L+as.integer(format(data$d,'%m'))-1L与 Stata 有差异 返回自 1960 年 1 月以来的月数,显式使用 Stata 月度单位。
month
提取月份
Stata
generate m = month(d)R 包:lubridate
mutate(data, m = lubridate::month(d))另有 1 个示例及替代实现
提取月份编号
Stata
generate z = month(d)R 包:base
data$z <- as.integer(format(data$d,'%m'))与 Stata 有差异 接收 R Date 列并返回所示日历要素;原始 Stata 日期编码须先转换。
qofd
由日期生成季度时期
Stata
generate q = qofd(d)R 包:tsibble
mutate(data, q = tsibble::yearquarter(d))与 Stata 有差异 R 使用 Date/POSIXct 或 tsibble 日历类别,而非 Stata 以 1960 年为起点的数值日期时间计数;交换底层数值须转换纪元和时区。
另有 1 个示例及替代实现
将 Date 日期转换为 Stata 季度编码
Stata
generate z = qofd(d)R 包:base
data$z <- (as.integer(format(data$d,'%Y'))-1960L)*4L+(as.integer(format(data$d,'%m'))-1L)%/%3L与 Stata 有差异 返回自 1960q1 以来的季度数,显式使用 Stata 季度单位。
quarter
提取日历季度编号
Stata
generate z = quarter(d)R 包:base
data$z <- (as.integer(format(data$d,'%m'))-1L)%/%3L+1L与 Stata 有差异 接收 R Date 列并返回所示日历要素;原始 Stata 日期编码须先转换。
real
文本转为数值
Stata
generate x = real(s)R 包:base
mutate(data, x = as.numeric(s))与 Stata 有差异 tidystata 的 destring() 还会去掉数值标签。 as.numeric() 对无效文本警告,与 Stata real() 不同;因子须先转为文本水平再转数字。
另有 1 个示例及替代实现
解析限定十进制格式并将无效文本设为缺失
Stata
generate z = real(s)R 包:base
valid <- grepl('^[+-]?[0-9]+([.][0-9]+)?$',data$s); data$z <- rep(NA_real_,length(valid)); data$z[valid] <- as.numeric(data$s[valid])与 Stata 有差异 特意限制格式以避免意外警告;科学计数法与带标记缺失需扩展处理。
regexm
匹配正则表达式
Stata
generate has = regexm(name, "^A")R 包:stringr
mutate(data, has = str_detect(name, "^A"))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
另有 1 个示例及替代实现
标记仅包含 ASCII 数字的字符串
Stata
generate z = regexm(s, "^[0-9]+$")R 包:base
data$z <- as.integer(grepl('^[0-9]+$',data$s))与 Stata 有差异 此简单共有正则可移植;高级模式下 Stata 与 R 正则引擎不同。
regexr
替换第一个正则匹配
Stata
generate s = regexr(name, "[0-9]+", "")R 包:stringr
mutate(data, s = str_replace(name, "[0-9]+", ""))与 Stata 有差异 str_replace_all() 替换所有匹配,相当于 ustrregexra()。 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
另有 1 个示例及替代实现
替换文本中的首段数字
Stata
generate z = regexr(s, "[0-9]+", "#")R 包:base
data$z <- sub('[0-9]+','#',data$s)与 Stata 有差异 首个正则匹配替换;高级正则功能因引擎而异。
regexreplaceall
替换文本中的全部数字段
Stata
generate z = regexreplaceall(s, "[0-9]+", "#")R 包:base
data$z <- gsub('[0-9]+','#',data$s)与 Stata 有差异 使用简单 ASCII 模式对应 StataNow regexreplaceall;旧版 Stata 使用其他函数。
regexs
提取匹配的文本
Stata
generate d = regexs(1) if regexm(name, "([0-9]+)")R 包:stringr
mutate(data, d = str_extract(name, "[0-9]+"))与 Stata 有差异 str_extract() 对不匹配行返回 NA;Stata generate … if 留下空字符串。regexs() 还依赖前面的 regexm() 匹配。
split
把文本拆分成多个变量
Stata
split name, parse(" ")R 包:tidyr
separate_wider_delim(data, name, delim = " ", names_sep = "_", too_few = "align_start")另有 2 个示例及替代实现
拆分两个数值字段并转换类型
Stata
split s, parse("-") destringR 包:tidyr
data <- tidyr::separate_wider_delim(data,s,delim='-',names=c('s1','s2'),cols_remove=FALSE); data$s1 <- as.integer(data$s1); data$s2 <- as.integer(data$s2)与 Stata 有差异 要求恰有两个干净整数字段;结果列名 s1、s2 固定。
拆分两部分分隔字符串
Stata
split s, parse("-") generate(part)R 包:base
parts <- strsplit(data$s,'-',fixed=TRUE); data$part1 <- vapply(parts,`[`,character(1),1); data$part2 <- vapply(parts,`[`,character(1),2)与 Stata 有差异 固定双字段示例,每行恰有一个分隔符;生成前缀 part 固定。
ss
从 UTC 时间戳提取秒
Stata
generate z = ss(t)R 包:base
data$z <- as.numeric(format(data$t,'%OS',tz='UTC'))与 Stata 有差异 输入为 R POSIXct 时间戳;小数秒精度依赖平台与显示设置。
string
数值转为文本
Stata
generate s = string(x)R 包:base
mutate(data, s = as.character(x))与 Stata 有差异 tidystata 的 decode() 对带标签的数据会使用数值标签。 as.character() 使用 R 数值格式和 NA 规则;Stata string() 使用数值显示格式并用 “.” 表示数值缺失。
stritrim
把连续空格合并为一个
Stata
generate s = stritrim(name)R 包:stringr
mutate(data, s = str_squish(name))与 Stata 有差异 str_squish() 同时会去掉首尾空格。
strlen
字符串长度
Stata
generate n = strlen(name)R 包:stringr
mutate(data, n = str_length(name))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
另有 1 个示例及替代实现
统计字节数而非 Unicode 字符数
Stata
generate z = strlen(s)R 包:base
data$z <- nchar(data$s,type='bytes')与 Stata 有差异 字节长度依赖编码;本例显式使用 UTF-8。
strlower
转为小写
Stata
generate s = strlower(name)R 包:stringr
mutate(data, s = str_to_lower(name))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
strltrim
strmatch
匹配通配符模式
Stata
generate m = strmatch(name, "A*")R 包:utils
mutate(data, m = grepl(glob2rx("A*"), name))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
另有 1 个示例及替代实现
匹配简单通配符模式
Stata
generate z = strmatch(s, "a*")R 包:base
data$z <- as.integer(grepl(utils::glob2rx('a*'),data$s))与 Stata 有差异 仅演示 * 通配符;更复杂模式需核对转义。
strofreal
strpos
是否包含某段文本
Stata
generate has = strpos(name, "a") > 0R 包:stringr
mutate(data, has = str_detect(name, fixed("a")))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
strproper
首字母大写
Stata
generate s = strproper(name)R 包:stringr
mutate(data, s = str_to_title(name))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
另有 1 个示例及替代实现
将英语地名各单词首字母大写
Stata
generate z = strproper(s)R 包:stringr
data$z <- stringr::str_to_title(data$s,locale='en')与 Stata 有差异 英语区域设置示例;标点与特定语言大小写规则可能不同。
strreverse
strrtrim
strtoname
把文本转为合法的变量名
Stata
generate n = strtoname(s)R 包:base
mutate(data, n = make.names(s))与 Stata 有差异 janitor::clean_names(data) 可以一次清理所有变量名。 make.names() 允许点号并按 R 规则处理保留词;strtoname() 按 Stata 允许字符和长度限制生成名称。
另有 1 个示例及替代实现
将短 ASCII 文本转为 Stata 风格名称
Stata
generate z = strtoname(s)R 包:base
data$z <- substr(gsub('[^A-Za-z0-9_]','_',data$s),1,32); data$z <- ifelse(grepl('^[0-9]',data$z),paste0('_',data$z),data$z)与 Stata 有差异 仅演示短 ASCII 名称;R 语法名称与 Stata 保留名规则不同。
strtrim
去掉首尾空格
Stata
generate s = strtrim(name)R 包:stringr
mutate(data, s = str_trim(name))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
strupper
转为大写
Stata
generate s = strupper(name)R 包:stringr
mutate(data, s = str_to_upper(name))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
subinstr
替换文本
Stata
generate s = subinstr(name, "a", "b", .)R 包:stringr
mutate(data, s = str_replace_all(name, fixed("a"), "b"))与 Stata 有差异 stringr 默认把模式当作正则表达式;fixed() 按字面匹配,与 subinstr() 一致。 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
subinword
替换简单 ASCII 文本中的完整单词
Stata
generate z = subinword(s, "cat", "dog", .)R 包:base
data$z <- gsub('\\bcat\\b','dog',data$s,perl=TRUE)与 Stata 有差异 使用正则单词边界;分隔符与 Unicode 规则可能不同于 Stata。
substr
截取字符串
Stata
generate s = substr(name, 1, 3)R 包:stringr
mutate(data, s = str_sub(name, 1, 3))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
另有 3 个示例及替代实现
提取最后三个 ASCII 字符
Stata
generate z = substr(s, -3, .)R 包:stringr
data$z <- stringr::str_sub(data$s,-3)按长度提取 ASCII 前缀
Stata
generate z = substr(s, 1, 3)R 包:base
data$z <- substr(data$s,1,3)uchar
upper
转为大写
Stata
generate s = upper(name)R 包:stringr
mutate(data, s = str_to_upper(name))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
ustrlen
ustrlower
按指定区域设置转换 Unicode 小写
Stata
generate z = ustrlower(s)R 包:stringr
data$z <- stringr::str_to_lower(data$s,locale='en')与 Stata 有差异 显式采用英语区域设置;语言相关大小写需选用适当区域设置。
ustrnormalize
规范化 Unicode 规范等价文本
Stata
generate z = ustrnormalize(s, "nfc")R 包:stringi
data$z <- stringi::stri_trans_nfc(data$s)ustrpos
ustrregexm
支持 Unicode 的正则表达式(忽略大小写)
Stata
generate has = ustrregexm(name, "^a", 1)R 包:stringr
mutate(data, has = str_detect(name, regex("^a", ignore_case = TRUE)))与 Stata 有差异 stringr 本身支持 Unicode,因此 Stata 中 u 开头的字符串函数不需要单独的版本。 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
另有 1 个示例及替代实现
检测 Unicode 字母
Stata
generate z = ustrregexm(s, "\p{L}+")R 包:stringr
data$z <- as.integer(stringr::str_detect(data$s,'\\p{L}+'))与 Stata 有差异 ICU 正则流程;R 缺失字符串保留 NA,而非 Stata 空字符串。
ustrregexra
ustrregexrf
ustrreverse
反转 Unicode 码点顺序
Stata
generate z = ustrreverse(s)R 包:stringi
data$z <- stringi::stri_reverse(data$s)与 Stata 有差异 组合符与字素簇可能需要不同的面向用户反转规则。
ustrtrim
ustrupper
按指定区域设置转换 Unicode 大写
Stata
generate z = ustrupper(s)R 包:stringr
data$z <- stringr::str_to_upper(data$s,locale='en')与 Stata 有差异 显式采用英语区域设置;特定区域大小写可能不同于 Stata 默认值。
usubstr
word
字符串的第一个词
Stata
generate w = word(name, 1)R 包:stringr
mutate(data, w = stringr::word(name, 1))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
另有 1 个示例及替代实现
提取第二个简单空白单词
Stata
generate z = word(s, 2)R 包:base
data$z <- vapply(strsplit(trimws(data$s),' +'),function(z) z[2],character(1))与 Stata 有差异 要求至少两个不带引号的简单词元;不复刻 Stata 引号词解析。
wordcount
词的个数
Stata
generate n = wordcount(name)R 包:stringr
mutate(data, n = str_count(name, "\\S+"))与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。
另有 1 个示例及替代实现
统计简单空白分隔词数
Stata
generate z = wordcount(s)R 包:base
data$z <- ifelse(trimws(data$s)=='',0L,lengths(strsplit(trimws(data$s),' +')))与 Stata 有差异 仅用于无引号 ASCII 单词;带引号的多词短语需要解析器。
year
提取年份
Stata
generate y = year(d)R 包:lubridate
mutate(data, y = lubridate::year(d))lubridate::month()、day() 和 wday() 提取其他部分。
另有 1 个示例及替代实现
提取日历年份
Stata
generate z = year(d)R 包:base
data$z <- as.integer(format(data$d,'%Y'))与 Stata 有差异 接收 R Date 列并返回所示日历要素;原始 Stata 日期编码须先转换。
ym
从年与月构建 Stata 月度编码
Stata
generate z = ym(year, month)R 包:base
data$z <- (data$year-1960L)*12L+data$month-1L与 Stata 有差异 要求月份为有效整数 1–12;输出使用自 1960 年 1 月起的 Stata 月数。
yq
从年与季度构建 Stata 季度编码
Stata
generate z = yq(year, quarter)R 包:base
data$z <- (data$year-1960L)*4L+data$quarter-1L与 Stata 有差异 要求季度为有效整数 1–4;输出使用自 1960q1 起的季度数。