数据在 R 中以丑陋的方式打包
Data packed in ugly way in R
我有一个无法解决的整理问题,现在真的不知道该怎么办。
我有一个标题,其中第一列 Id 存储一个整数 ID,第二列值如下所示:
“2.3(09/13)2.6(10/14)2.9(4/15)”
所以它是 Numeric(Date)Numeric(Date)Numeric(Date) 等等。
问题是,我无法确定这种模式会重复多少次。
示例数据:
1 0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896(11/17)
2 0.144(06/17)0.171(08/17)0.21(11/17)
我正在寻找的是这样的东西:
1 0.2 01/17
1 0.19 02/17
1 0.254 03/17
...
我想做的是将其转换为 long-formatted 列表之类的东西。
我尝试使用
separate(tibble,
col = "values",
into = c("a","b","c","d","e","f","g","h","i","l"),
sep=c("\(","\)")
)
如果我在此之后使用 pivot_longer
,我可以让它工作,但这个问题开始让我感兴趣,所以现在我试图以更好的方式解决它。
我一直只研究Java之类的,所以这种逻辑对我来说很陌生。
谢谢!
...抱歉,我不知道如何将数据格式化为表格。
编辑:抱歉,我没有解释清楚我的数据格式!
正确的格式是 c(1,2),c(0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896( 11/17),0.144(06/17)0.171(08/17)0.21(11/17))
很抱歉,但我可以从@jay.sf 那里得到答案来工作,非常感谢!
Base R 方法,将 strsplit
结果排列成矩阵。
res <- do.call(rbind.data.frame, Map(function(x, y)
transform(data.frame(id=y, matrix(el(strsplit(x, "[()]")), ncol=2, b=T)),
X1=as.numeric(levels(X1))[X1]),
Map(`[`, strsplit(x, " "), 2), substr(x, 1, 1)))
res
# id X1 X2
# 1 1 0.200 01/17
# 2 1 0.190 02/17
# 3 1 0.254 03/17
# 4 1 0.260 07/17
# 5 1 0.217 09/17
# 6 1 0.720 11/17
# 7 1 0.896 11/17
# 8 2 0.144 06/17
# 9 2 0.171 08/17
# 10 2 0.210 11/17
数据
x <- c("1 0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896(11/17)",
"2 0.144(06/17)0.171(08/17)0.21(11/17)")
代码:
do.call('rbind', unlist(
apply(df, 1, function(x){
lapply(strsplit(x, ")", fixed = TRUE), function(y) {
m <- do.call('rbind', strsplit(y, "(", fixed = TRUE))
m <- as.data.frame(m, stringsAsFactors = FALSE)
names(m) <- c('val', 'date')
m$val <- as.numeric(m$val)
m
})
} ), recursive = FALSE))
# val date
# values.1 0.200 01/17
# values.2 0.190 02/17
# values.3 0.254 03/17
# values.4 0.260 07/17
# values.5 0.217 09/17
# values.6 0.720 11/17
# values.7 0.896 11/17
# values.11 0.144 06/17
# values.21 0.171 08/17
# values.31 0.210 11/17
数据:
df <- read.table(text='values
1 0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896(11/17)
2 0.144(06/17)0.171(08/17)0.21(11/17)', stringsAsFactors = FALSE, header = TRUE)
我有一个无法解决的整理问题,现在真的不知道该怎么办。
我有一个标题,其中第一列 Id 存储一个整数 ID,第二列值如下所示: “2.3(09/13)2.6(10/14)2.9(4/15)” 所以它是 Numeric(Date)Numeric(Date)Numeric(Date) 等等。
问题是,我无法确定这种模式会重复多少次。
示例数据:
1 0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896(11/17)
2 0.144(06/17)0.171(08/17)0.21(11/17)
我正在寻找的是这样的东西: 1 0.2 01/17 1 0.19 02/17 1 0.254 03/17 ...
我想做的是将其转换为 long-formatted 列表之类的东西。 我尝试使用
separate(tibble,
col = "values",
into = c("a","b","c","d","e","f","g","h","i","l"),
sep=c("\(","\)")
)
如果我在此之后使用 pivot_longer
,我可以让它工作,但这个问题开始让我感兴趣,所以现在我试图以更好的方式解决它。
我一直只研究Java之类的,所以这种逻辑对我来说很陌生。
谢谢!
...抱歉,我不知道如何将数据格式化为表格。
编辑:抱歉,我没有解释清楚我的数据格式! 正确的格式是 c(1,2),c(0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896( 11/17),0.144(06/17)0.171(08/17)0.21(11/17)) 很抱歉,但我可以从@jay.sf 那里得到答案来工作,非常感谢!
Base R 方法,将 strsplit
结果排列成矩阵。
res <- do.call(rbind.data.frame, Map(function(x, y)
transform(data.frame(id=y, matrix(el(strsplit(x, "[()]")), ncol=2, b=T)),
X1=as.numeric(levels(X1))[X1]),
Map(`[`, strsplit(x, " "), 2), substr(x, 1, 1)))
res
# id X1 X2
# 1 1 0.200 01/17
# 2 1 0.190 02/17
# 3 1 0.254 03/17
# 4 1 0.260 07/17
# 5 1 0.217 09/17
# 6 1 0.720 11/17
# 7 1 0.896 11/17
# 8 2 0.144 06/17
# 9 2 0.171 08/17
# 10 2 0.210 11/17
数据
x <- c("1 0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896(11/17)",
"2 0.144(06/17)0.171(08/17)0.21(11/17)")
代码:
do.call('rbind', unlist(
apply(df, 1, function(x){
lapply(strsplit(x, ")", fixed = TRUE), function(y) {
m <- do.call('rbind', strsplit(y, "(", fixed = TRUE))
m <- as.data.frame(m, stringsAsFactors = FALSE)
names(m) <- c('val', 'date')
m$val <- as.numeric(m$val)
m
})
} ), recursive = FALSE))
# val date
# values.1 0.200 01/17
# values.2 0.190 02/17
# values.3 0.254 03/17
# values.4 0.260 07/17
# values.5 0.217 09/17
# values.6 0.720 11/17
# values.7 0.896 11/17
# values.11 0.144 06/17
# values.21 0.171 08/17
# values.31 0.210 11/17
数据:
df <- read.table(text='values
1 0.2(01/17)0.19(02/17)0.254(03/17)0.26(07/17)0.217(09/17)0.72(11/17)0.896(11/17)
2 0.144(06/17)0.171(08/17)0.21(11/17)', stringsAsFactors = FALSE, header = TRUE)