字符和日期变量

先查看各命令展开的示例,再按需展开其他选项及 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

提取日

Stata

generate dd = day(d)

R 包:lubridate

mutate(data, dd = lubridate::day(d))
另有 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

今天的日期

Stata

display c(current_date)

R 包:base

Sys.Date()

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

显示日期

Stata

format d %td

R 包:base

format(data$d, "%d%b%Y")

日期保持其类型不变;format() 只改变显示方式。

generate

以年计的年龄或时长

Stata

generate age = (d2 - d1) / 365.25

R 包: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() 匹配。

另有 1 个示例及替代实现

提取第一个捕获组

Stata

generate z = regexs(1) if regexm(s, "([A-Z]+)-([0-9]+)")

R 包:stringr

data$z <- stringr::str_match(data$s,'([A-Z]+)-([0-9]+)')[,2]

R 直接返回捕获组,无需前一个全局匹配状态;未匹配行返回 NA。

split

把文本拆分成多个变量

Stata

split name, parse(" ")

R 包:tidyr

separate_wider_delim(data, name, delim = " ", names_sep = "_", too_few = "align_start")
另有 2 个示例及替代实现

拆分两个数值字段并转换类型

Stata

split s, parse("-") destring

R 包: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() 同时会去掉首尾空格。

另有 1 个示例及替代实现

合并重复内部 ASCII 空格

Stata

generate z = stritrim(s)

R 包:base

data$z <- gsub(' +',' ',data$s)

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。

另有 1 个示例及替代实现

将 ASCII 文本转为小写

Stata

generate z = strlower(s)

R 包:base

data$z <- tolower(data$s)

strltrim

仅清除开头 ASCII 空格

Stata

generate z = strltrim(s)

R 包:base

data$z <- sub('^ +','',data$s)

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

将数值格式化为补零文本

Stata

generate z = strofreal(x, "%06.0f")

R 包:base

data$z <- sprintf('%06.0f',data$x)

strpos

是否包含某段文本

Stata

generate has = strpos(name, "a") > 0

R 包:stringr

mutate(data, has = str_detect(name, fixed("a")))

与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。

另有 1 个示例及替代实现

定位 ASCII 子串并以零表示未找到

Stata

generate z = strpos(s, "cat")

R 包:base

position <- regexpr('cat',data$s,fixed=TRUE); data$z <- ifelse(position<0,0L,as.integer(position))

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

反转简单 ASCII 文本

Stata

generate z = strreverse(s)

R 包:base

data$z <- vapply(strsplit(data$s,''),function(z) paste(rev(z),collapse=''),character(1))

strrtrim

仅清除结尾 ASCII 空格

Stata

generate z = strrtrim(s)

R 包:base

data$z <- sub(' +$','',data$s)

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。

另有 1 个示例及替代实现

清除首尾 ASCII 空格

Stata

generate z = strtrim(s)

R 包:base

data$z <- trimws(data$s,whitespace=' ')

strupper

转为大写

Stata

generate s = strupper(name)

R 包:stringr

mutate(data, s = str_to_upper(name))

与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。

另有 1 个示例及替代实现

将 ASCII 文本转为大写

Stata

generate z = strupper(s)

R 包:base

data$z <- toupper(data$s)

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。

另有 2 个示例及替代实现

替换全部字面匹配

Stata

generate z = subinstr(s, "cat", "dog", .)

R 包:base

data$z <- gsub('cat','dog',data$s,fixed=TRUE)

仅替换首个字面匹配

Stata

generate z = subinstr(s, "cat", "dog", 1)

R 包:base

data$z <- sub('cat','dog',data$s,fixed=TRUE)

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)

按起点与长度提取 ASCII 文本

Stata

generate z = substr(s, 3, 2)

R 包:base

data$z <- substr(data$s,3,4)

Stata 参数为长度;R substr 参数为包含在内的终点。

uchar

从 Unicode 码点创建字符

Stata

generate z = uchar(code)

R 包:base

data$z <- vapply(data$code,intToUtf8,character(1))

upper

转为大写

Stata

generate s = upper(name)

R 包:stringr

mutate(data, s = str_to_upper(name))

与 Stata 有差异 R 的 Unicode、正则和大小写规则可能不同于非 ustr Stata 函数;Stata 空字符串即缺失,R 则区分空串和 NA。

ustrlen

统计 Unicode 码点数

Stata

generate z = ustrlen(s)

R 包:base

data$z <- nchar(data$s,type='chars')

统计码点数,不是可见字素簇数。

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)

规范化 Unicode 兼容字符

Stata

generate z = ustrnormalize(s, "nfkc")

R 包:stringi

data$z <- stringi::stri_trans_nfkc(data$s)

ustrpos

按码点位置定位 Unicode 子串

Stata

generate z = ustrpos(s, "猫")

R 包:base

position <- regexpr('\u732b',data$s,fixed=TRUE); data$z <- ifelse(position<0,0L,as.integer(position))

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

替换所有 ICU 正则匹配

Stata

generate z = ustrregexra(s, "[0-9]+", "#")

R 包:stringr

data$z <- stringr::str_replace_all(data$s,'[0-9]+','#')

ustrregexrf

替换首个 ICU 正则匹配

Stata

generate z = ustrregexrf(s, "[0-9]+", "#")

R 包:stringr

data$z <- stringr::str_replace(data$s,'[0-9]+','#')

ustrreverse

反转 Unicode 码点顺序

Stata

generate z = ustrreverse(s)

R 包:stringi

data$z <- stringi::stri_reverse(data$s)

与 Stata 有差异 组合符与字素簇可能需要不同的面向用户反转规则。

ustrtrim

清除首尾 Unicode 空白

Stata

generate z = ustrtrim(s)

R 包:stringr

data$z <- stringr::str_trim(data$s)

ustrupper

按指定区域设置转换 Unicode 大写

Stata

generate z = ustrupper(s)

R 包:stringr

data$z <- stringr::str_to_upper(data$s,locale='en')

与 Stata 有差异 显式采用英语区域设置;特定区域大小写可能不同于 Stata 默认值。

usubstr

按位置提取一个 Unicode 码点

Stata

generate z = usubstr(s, 2, 1)

R 包:base

data$z <- substr(data$s,2,2)

R 字符索引按码点计;不按字素簇计。

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 起的季度数。