用于内部使用strsplit的用户定义函数的语法

时间:2013-01-28 12:36:50

标签: r syntax user-defined-functions strsplit

我正在编写一个实用程序函数来进行一些数据格式转换,我无法正确地说明它,因此它适用于我想要它应用的数据,并返回正确形状的结果。

我有一个名为HiRawTiny的测试数据集,str如下所示。 V1中的数据是char。我有一个名为GetRank的测试函数,它的作用是将所有字符放在“:”的右边并强制它们为数字。这也在下面说明。我在fn中用来获取strsplit输出的列表语法列表对我来说有点不透明,坦率地说,我是通过反复试验来达到它的,但是当传递单个值时似乎工作正常。但是当我向它传递一个向量(一个数据框列)时,它不会给我一个矢量结果,它与我传递的向量的长度相同,但只有一个值。

我应该怎么做才能解决这个问题?我是R的新手(虽然我曾经在几十年前使用过S),并怀疑我遇到了语法混乱。根据我的目的,我的函数语法是错误的吗?我应该考虑使用“apply”或其中一位朋友来做这件事吗?或者fn能够原生地处理向量/向量输出吗?

str(HiRawTiny)

>'data.frame':  10 obs. of  7 variables:  
>$ V1: chr  "RANK:1" "RANK:2" "RANK:3" "RANK:4" ...  
$ V2: chr 
> "SOURCEID:CWC02001632398F4C" "SOURCEID:CWC020000F0D57DD6"
> "SOURCEID:CWC0200214C29872E" "SOURCEID:CWC0200163206B9F2" ...  
$ V3:
> chr  "TIME:01:04:2012-22:23:58" "TIME:01:04:2012-12:07:55"
> "TIME:01:04:2012-12:39:51" "TIME:02:04:2012-07:18:25" ...  
$ V4: chr 
> "SCORE:3142" "SCORE:3040" "SCORE:2911" "SCORE:2882" ...  
$ V5: chr 
> "TIEBREAK:4923864" "TIEBREAK:5787094" "TIEBREAK:766764"
> "TIEBREAK:1872936" ...  
$ V6: chr  "" "" "" "" ...  
$ V7: chr  "" ""
> "" "" ...

 GetRank function(x) {as.numeric(strsplit(x, split=":")[[1]][2]) }

GetRank(HiRawTiny[1,1]) [1] 1
GetRank(HiRawTiny[2,1]) [1] 2
GetRank(HiRawTiny[,1]) [1] 1

#"What I want is a vector of GetRank being applied to all of column 1

3 个答案:

答案 0 :(得分:3)

strsplit返回listlist的每个元素都包含分割的字符串。您可以使用listmatrixdo.call更改为rbind,然后选择第二列,

GetRank <- function(x) {as.numeric(do.call(rbind, strsplit(x, split=":"))[, 2]) }

GetRank(HiRawTiny$V1)

答案 1 :(得分:3)

另一种方式(使用@ Stephan&#39; s foo):

# split by strsplit, results in a list with the 2nd element of 
# each element of the list always being the number you want.
# so pick it up using sapply with "[[" and convert it to numeric
> as.numeric(sapply(strsplit(foo, ":"), "[[", 2))

答案 2 :(得分:2)

您需要unlist strsplit的结果,然后提取您感兴趣的条目。

foo <- paste("RANK:",1:10,sep="")
GetRank <- function(x) {
  as.numeric(unlist(strsplit(x,":"))[seq(2,2*length(x),by=2)])
}
GetRank(foo)

尝试逐位将数据提供给函数,并跟踪每个连续步骤中发生的情况。