我已将我的CSV文件作为数据框导入R中,并且我已将感兴趣的列(AtollInservice$Antenna
)指定为一个因素。
原始CSV文件在我感兴趣的列中具有以下格式:
COM_CVV65BSX-M\COM_CVV65BSX-M_2100_T02
正如您将注意到,在导入read.csv并使用head()函数时,我的原始文件中只有一个“\”,R似乎重复了反斜杠,如下所示:
> head(AtollInService$ANTENNA)
[1] COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02
COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02
COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02
[4] COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02
COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02
COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02
文件中字符串的开头有重复,我希望保留超出\或\的所有内容,以便COM是制造商,CVV65BSX-M是模型,2100是波段,T02是倾斜。
我尝试将Hadley Wickham的colsplit函数合并到转换函数中,但我不断被提示输入我无法破解的其他信息。
如果有人建议如何在原始数据框中拆分此特定列,我将很高兴收到您的回复。附件是指向我正在使用并希望拆分的数据样本的链接,特别是列“P”是有意义的。
这是我正在使用的数据框:
AtollInService <- with(Atoll, Atoll[!grepl("[_()]", NOMINAL_ID) & grepl("InService", MILESTONE) & grepl("^[A-Z][A-Z][0-9]{4}$", NOMINAL_ID) & !grepl("[L18]+[L08]", THREE_G_CELL_ID), ])
我可以在结束方括号和结束括号之后加入字符串拆分功能吗?
答案 0 :(得分:1)
假设这是您的原始数据框(简化为两列来说明):
AtollInservice
# ANTENNA MILESTONE
# 1 COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService
# 2 COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService
# 3 COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService
# 4 COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService
# 5 COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService
# 6 COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 NoService
以下是包含data.table
包的选项,您可以非常轻松地过滤和创建新列,这假设ANTENNA
列始终具有相同的格式,您可以定期使用tstrsplit
表达式_|\\\\
,它分为_
或\\
,然后将最后四个元素作为列:
library(data.table)
(setDT(AtollInservice)[grepl("InService", MILESTONE)]
[, c("manufacturer", "model", "band", "tilt") :=
tstrsplit(ANTENNA, "_|\\\\")[3:6]][])
# ANTENNA MILESTONE manufacturer model band tilt
#1: COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService COM CVV65BSX-M 2100 T02
#2: COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService COM CVV65BSX-M 2100 T02
#3: COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService COM CVV65BSX-M 2100 T02
#4: COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService COM CVV65BSX-M 2100 T02
#5: COM_CVV65BSX-M\\COM_CVV65BSX-M_2100_T02 InService COM CVV65BSX-M 2100 T02