我正在尝试从字符串列表中获取IP地址的主机。
ips <- c('140.112.204.42', '132.212.14.139', '31.2.47.93', '7.112.221.238')
我想从ips获取前2位数字。输出:
ips <- c('140.112', '132.212', '31.2', '7.112')
这是我编写的用于转换它们的代码:
cat(unlist(strsplit(ips, "\\.", fixed = FALSE))[1:2], sep = ".")
当我最终检查单个ip的类型时,我得到的是这样的:
140.112 NULL
不知道我在做什么错。如果您有其他一些与此完全不同的想法,那也完全可以。
最佳答案
用sub
:
ips <- c('140.112.204.42', '132.212.14.139', '31.2.47.93', '7.112.221.238')
sub('\\.\\d+\\.\\d+$', '', ips)
# [1] "140.112" "132.212" "31.2" "7.112"
使用
str_extract
中的stringr
:library(stringr)
str_extract(ips, '^\\d+\\.\\d+')
# [1] "140.112" "132.212" "31.2" "7.112"
使用
strsplit
+ sapply
:sapply(strsplit(ips, '\\.'), function(x) paste(x[1:2], collapse = '.'))
# [1] "140.112" "132.212" "31.2" "7.112"
使用
read.table
+ apply
:apply(read.table(textConnection(ips), sep='.')[1:2], 1, paste, collapse = '.')
#[1] "140.112" "132.212" "31.2" "7.112"
注意:
sub('\\.\\d+\\.\\d+$', '', ips)
:一世。
\\.\\d+\\.\\d+$
在字符串的末尾匹配一个文字点,一个或多个数字,一个文字点和一个或多个数字ii。
sub
从字符串str_extract(ips, '^\\d+\\.\\d+')
:一世。
^\\d+\\.\\d+
在字符串的开头匹配一个或多个数字,一个文字点和一个或多个数字ii。
str_extract
从字符串sapply(strsplit(ips, '\\.'), function(x) paste(x[1:2], collapse = '.'))
:一世。
strsplit(ips, '\\.')
使用文字点作为定界符分割每个ip
。分割后返回向量列表ii。使用
sapply
,paste(x[1:2], collapse = '.')
应用于列表的每个元素,因此仅取每个向量中的前两个数字,并将它们折叠成一个点作为分隔符。然后sapply
将列表强制为一个向量,从而返回所需ips的向量。 apply(read.table(textConnection(ips), sep='.')[1:2], 1, paste, collapse = '.')
:一世。
read.table(textConnection(ips), sep='.')[1:2]
将ips
视为文本输入,并以点作为定界符读取它。仅取前两列。ii。
apply
使paste
可以在每行上操作,并以点折叠。 关于r - 分割并重新连接字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51447942/