我正在编写一个实用程序函数来进行一些数据格式转换,我无法正确地说明它,因此它适用于我想要它应用的数据,并返回正确形状的结果。
我有一个名为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
答案 0 :(得分:3)
strsplit
返回list
。 list
的每个元素都包含分割的字符串。您可以使用list
和matrix
将do.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)
尝试逐位将数据提供给函数,并跟踪每个连续步骤中发生的情况。