我正在使用数据,其中文本注释用于记录字段内容的更改,而不是具有额外的记录和开始/结束日期。所以数据看起来像这样:
Study Fob
1 100
2 101 now 102
3 103
注意:测试数据可以用:
构建df <- data.frame(Study = 1:3,
Fob = c("100", "101 now 102", "103"),
stringsAsFactors = FALSE)
我想最终得到以下表格,以便我可以将其处理为从Fob信号数据到研究ID的多对一转换:
Study Fob
1 100
2 101
2 102
3 103
我可以用以下方法摆脱多余的文字:
df$IDs <- strsplit(df$Fob, "[^0-9]+")
让我:
Study Fob IDs
1 100 100
2 101 now 102 c("101", "102")
3 103 103
但无法继续下去。我的第一个想法是使用基于ID长度的计数器尝试replicate
具有多个ID(如2)的行,但添加df$counter <- length(df$IDs)
只会得到一个值为3的列,因为它取ID列的长度,而不是其中的元素。
答案 0 :(得分:3)
一个选项是来自cSplit
的{{1}}。我们将模式指定为library(splitstackshape)
,使用split
作为默认值fixed=FALSE
和fixed=TRUE
direction = 'long'
library(splitstackshape)
cSplit(df, 'Fob', '[^0-9]+', fixed=FALSE, 'long')
# Study Fob
#1: 1 100
#2: 2 101
#3: 2 102
#4: 3 103
意味着还有一个不是数字的字符。因此,它将被所有非数字字符拆分,只留下数字部分。默认情况下为[^0-9]+
,因此我们将在type.convert=TRUE
之后获取数字列class
。
或者,不是使用split
,而是使用[^0-9]+
来压缩所有非数字字符(来自@David Arenburg&#39;)
\\D+