Cas*_*gua 3 r concatenation large-data
我正在处理一个大型数据框,其中包含一个串联向量,该向量中包含几条信息。我需要提取这些值进行分析,这可以使用 substr() 函数来完成,但观察结果的长度不同,这使得这不理想。虽然我有一些工作代码,但数据集的大小意味着需要相当长的时间来处理,并且想知道是否有更好的方法。
例如,“97110770”的 8 位数据点包含以下信息
但有些值是 9 位数字,例如“114123411”,其中:
为了解决这个问题,我想在较小的变量前面添加一个“0”,这样它们的长度就相同(时间值后面的数字一致,所以它可以正常工作)并想出了以下代码:
(数据框:data,感兴趣的向量speakerid:)
congv <- vector(mode = "numeric")
memberidv <- vector(mode = "numeric")
chamberv <- vector(mode = "numeric")
for (i in 1:length(data$speakerid)) {
if(nchar(data$speakerid[i]) == 8) {
data$speakerid[i] = paste0("0", data$speakerid[i])
}
congv <- append(congv, substr(data$speakerid[i], 1, 3) )
memberidv <- append(memberidv, substr(data$speakerid[i], 4, 8))
chamberv <- append(chamberv, substr(data$speakerid[i], 9, 9))
}
data <- cbind(data, cong = congv, memberid = memberidv, chamber = chamberv)
data <- select(data, "memberid", "count", "chamber", "cong")
rm(list = c("congv", "memberidv", "chamberv"))
Run Code Online (Sandbox Code Playgroud)
这是可行的,但由于数据的大小(超过 100k 个观察值),它花费的时间比我想要的要长得多(因为我稍后可能需要包含更多数据),我想知道是否有更有效的方法来执行此操作(也许不使用 for-if 循环?)
如果没有,我对 R 还很陌生,希望您能提供有关我的代码的任何其他提示,谢谢!
Example dataframe:
speakerid = c(97110770, 114123411, 93123770, 112123410, 93123770)
count = c(12, 3, 4, 0, 4)
data = data.frame(speakerid, count)
Run Code Online (Sandbox Code Playgroud)
这是一个根本不使用任何字符串的替代方案
library(data.table)
setDT(data)[, {congv=speakerid %/% 1e6; .(memberid=(speakerid-congv*1e6)%/%10, count, chamberv=speakerid %% 10, congv)}]
Run Code Online (Sandbox Code Playgroud)
输出
memberid count chamberv congv
<num> <num> <num> <num>
1: 11077 12 0 97
2: 12341 3 1 114
3: 12377 4 0 93
4: 12341 0 0 112
5: 12377 4 0 93
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |