【发布时间】:2012-09-13 09:31:19
【问题描述】:
如何根据空间创建不同的列,例如:“我要出去”
ANs 3
Column1 Column2 Column3 Column14
I am going out
【问题讨论】:
-
也许你想要
read.fwf虽然我不确定你在追求什么。
如何根据空间创建不同的列,例如:“我要出去”
ANs 3
Column1 Column2 Column3 Column14
I am going out
【问题讨论】:
read.fwf 虽然我不确定你在追求什么。
如果您想要实际的列值,如您的示例所示,那么您可以从文本连接中读取表格:
> read.table(textConnection("I am going Out"))
V1 V2 V3 V4
1 I am going Out
要回答你的问题的标题,即有多少个空格,你可以使用ncol来计算上面的列,然后减一。但是,如果您只对空格的数量感兴趣,则以下方法更有效:
length(gregexpr(" ", "I am going Out")[[1]])
这使用正则表达式来搜索空格。
[[1]] 获取结果列表的第一个元素,该元素对应于输入向量的第一项,其中“我要出去”作为其唯一元素。如果您在那里传递了一个不同的向量,您的列表可能有多个元素,或者对于一个空向量根本没有。
如果没有空格,gregexpr 仍然会返回一个长度为1 的列表,其中-1 作为匹配的位置,表示没有匹配。这会导致上述代码在这种情况下错误地报告一个结果。下面是一个更复杂的解决方案,它处理这个问题并接受向量作为输入:
countSpaces <- function(s) { sapply(gregexpr(" ", s), function(p) { sum(p>=0) } ) }
该函数的工作原理如下:gregexpr 将返回一个 list 结果,一个用于输入 vector s 的每个元素。 sapply 将遍历该列表,并为列表中的每个元素计算匹配数。它不计算匹配位置向量的length,而是使用sum 仅计算非负值,从而丢弃由匹配失败引起的任何-1。在该总和中发生了从 FALSE/TRUE 到 0/1 的隐式转换。 sapply 的结果将再次成为一个向量,因此可以很好地匹配输入向量。
此函数可用于重写数据帧,如one comment 中要求的那样。因此,假设您有一个名为foo 的数据框,它在bar 列中有字符串,并且应该修改为在新列baz 中包含这些计数。你可以这样写
foo <- transform(foo, baz = countSpaces(bar))
【讨论】:
length(gregexpr("[ ]+", "I am going out")[[1]])(答案 = 3)。使用该短语(带有额外空格),您使用的方法计算 每个 空格。
另一种方法是使用strsplit函数:
R> strsplit("I am going Out", " ")[[1]]
[1] "I" "am" "going" "Out"
所以我们将第一个参数 - I am going Out - 除以第二个参数 - 空白空间。那么我们就可以使用length:
R> length(strsplit("I am going Out", " ")[[1]])
[1] 4
【讨论】:
您也可以使用stringr 包中的str_count。这些不太冗长,避免使用正则表达式可能会更快一些。
library(stringr)
text = "I am going Out"
#matches regular expression
str_count(text, ' ')
或者,如果你想要更快的东西
#matches literal text
str_count(text, fixed(' '))
【讨论】:
我必须承认我没有仔细阅读,所以这可能不是你想要的,但有可能......
x <- "I am going Out"
nchar(x)- nchar(gsub(" ", "", x))
MvG 原始建议的替代方案(虽然不那么漂亮):
as.data.frame(matrix(unlist(strsplit("I am going Out", "\\s+", perl=TRUE)), nrow=1))
【讨论】: