R语言二进制数位提取:从字符串中分离指定位并生成新列
从二进制字符串提取指定数位并生成新列(R语言)
首先明确:二进制字符串的数位计数要先搞清楚是从左数还是从右数,比如'00110011':
- 左数第6位是
0,第7位是1 - 右数第6位是
1,第7位是1
最优方案:直接操作字符串(无需转整数)
因为你的数据是字符串格式的二进制,直接按位置提取是最直观高效的,不管是单个值还是批量处理CSV都适用:
1. 单个二进制字符串的提取
data <- '00110011' # 提取左数第6位 digit_6_left <- substr(data, 6, 6) # 提取左数第7位 digit_7_left <- substr(data, 7, 7) # 如果是从右数 digit_6_right <- substr(data, nchar(data)-6+1, nchar(data)-6+1) digit_7_right <- substr(data, nchar(data)-7+1, nchar(data)-7+1)
2. 处理CSV文件,生成新列
假设你的CSV读入后是数据框df,二进制列名为binary_col:
# 读入CSV df <- read.csv("your_dota_data.csv") # 生成左数第6、7位的新列(字符型) df$digit_6 <- substr(df$binary_col, 6, 6) df$digit_7 <- substr(df$binary_col, 7, 7) # 如果需要转成数值型 df$digit_6 <- as.integer(df$digit_6) df$digit_7 <- as.integer(df$digit_7)
如果习惯用stringr包,提取从右数的数位会更简洁:
library(stringr) # 右数第6位 df$digit_6_right <- str_sub(df$binary_col, -6, -6) # 右数第7位 df$digit_7_right <- str_sub(df$binary_col, -7, -7)
关于你原有代码的问题
你的代码里有几个小错误(比如For应该小写for,变量名I和i、Bits和bits大小写不一致),而且转整数后计算的是从右数的数位:比如bits[1]是右数第1位,bits[8]是左数第1位。如果用原有逻辑提取左数第6、7位,对应的是bits[3]和bits[2],但这种方法绕了一圈,不如直接操作字符串高效直观,尤其是批量处理大量数据时。
内容的提问来源于stack exchange,提问作者kenhood
相关产品推荐
相关产品推荐

