1

我正在编写一个实用函数来进行一些数据格式转换,但我无法正确说明它,以便它适用于我希望它适用的数据,并返回正确形状的结果。

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

我应该怎么做才能解决这个问题?我是 R 新手(尽管我在几十年前曾经使用过 S),并且怀疑我陷入了语法混乱。鉴于我正在尝试做的事情,我的函数语法是否错误?我应该考虑使用“应用”或其朋友之一来做到这一点吗?或者 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
4

3 回答 3

3

strsplit返回一个list. 的每个元素都list包含分割后的字符串。您可以将 更改listmatrixwithdo.call然后rbind选择第二列,

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

GetRank(HiRawTiny$V1)
于 2013-01-28T12:48:10.603 回答
3

只是另一种方式(使用@Stephan'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))
于 2013-01-28T13:17:52.963 回答
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)

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

于 2013-01-28T12:42:10.417 回答