R 将任意列拆分为数据帧
我有一个data.frame,它有一个丑陋的列,包含结构化数据。每列可以容纳1到40个感兴趣的值。每个值都用html分隔符R 将任意列拆分为数据帧,r,lapply,tidyr,R,Lapply,Tidyr,我有一个data.frame,它有一个丑陋的列,包含结构化数据。每列可以容纳1到40个感兴趣的值。每个值都用html分隔符“”。以1.1形式提取的值,即一个整数、一个周期和另一个整数 如何将这些列分隔并合并成不同的行? 我知道拉普拉和迪迪很可能是分开的方式。但我还没有成功。所以请求帮助 测试数据如下: testdata <- dget("http://pastebin.com/download.php?i=VS2cq2rB") 这是我最近的一次尝试——与我从lapply开始的时候相去甚远
“
”
。以1.1
形式提取的值,即一个整数、一个周期和另一个整数
如何将这些列分隔并合并成不同的行?
我知道拉普拉和迪迪很可能是分开的方式。但我还没有成功。所以请求帮助
测试数据如下:
testdata <- dget("http://pastebin.com/download.php?i=VS2cq2rB")
这是我最近的一次尝试——与我从lapply开始的时候相去甚远
origdf <- data.frame()
#names(newdf) <- c("id", 'pnummer', 'moduler')
for (i in 1:nrow(hs)) {
newdf <- data.frame()
newdf[i, 'id'] <- hs[i, 'id']
newdf[i, 'pnummer'] <- hs[i, 'pnummer']
tmp <- unlist(strsplit(as.character(hs[i,'moduler']), "<br />", fixed=T))
for (m in 3:length(tmp)+3) {
newdf[i, m] <- tmp[m]
}
origdf <- dplyr::bind_rows(newdf, origdf)
}
origdf这里有一种可能的data.table
方法。基本上,我只是通过“
”或“
”或“Installationsmontør”
通过id来拆分模块
library(data.table)
setDT(testdata)[, .(value = unlist(strsplit(as.character(moduler),
"<br />|<br />Installationsmontør"))), by = id]
# id value
# 1: 2862 1.1
# 2: 2862 1.2
# 3: 2862 1.3
# 4: 2862 1.4
# 5: 2862 1.5
# ---
# 132: 2877 3.6
# 133: 2877 4.1
# 134: 2877 4.4
# 135: 2877 4.5
# 136: 2877 4.6
下面是一种可能的数据表方法。基本上,我只是通过“
”或“
”或“Installationsmontør”
通过id来拆分模块
library(data.table)
setDT(testdata)[, .(value = unlist(strsplit(as.character(moduler),
"<br />|<br />Installationsmontør"))), by = id]
# id value
# 1: 2862 1.1
# 2: 2862 1.2
# 3: 2862 1.3
# 4: 2862 1.4
# 5: 2862 1.5
# ---
# 132: 2877 3.6
# 133: 2877 4.1
# 134: 2877 4.4
# 135: 2877 4.5
# 136: 2877 4.6
我会尝试将strsplit函数用于一个简单的循环:
newdata <- NULL
a <- 1
b <- 0
for (k in 1:length(testdata$moduler)) {
M <- unlist(strsplit(as.character(testdata$moduler[k]),"<br />|<br />Installationsmontør"))
b <- b + length(M)
newdata$moduler[a:b] <- M
newdata$id[a:b] <- testdata$id[k]
a <- b + 1
}
newdata <- as.data.frame(newdata)
newdata我会尝试在一个简单的循环中使用strsplit函数:
newdata <- NULL
a <- 1
b <- 0
for (k in 1:length(testdata$moduler)) {
M <- unlist(strsplit(as.character(testdata$moduler[k]),"<br />|<br />Installationsmontør"))
b <- b + length(M)
newdata$moduler[a:b] <- M
newdata$id[a:b] <- testdata$id[k]
a <- b + 1
}
newdata <- as.data.frame(newdata)
newdata这里是另一个使用tidyr
中的unnest
的选项。我们使用str\u extract\u all
从库(stringr)
中提取数字部分([0-9.]+
)。输出是一个列表
。我们将列表
元素的名称设置为'testdata'的'id'列和unest
library(tidyr)
library(stringr)
res <- unnest(setNames(lapply(str_extract_all(testdata$moduler, '[0-9.]+'),
as.numeric), testdata$id), id)
colnames(res)[2] <- 'value'
head(res)
# id value
#1 2862 1.1
#2 2862 1.2
#3 2862 1.3
#4 2862 1.4
#5 2862 1.5
#6 2862 1.6
dim(res)
#[1] 136 2
下面是另一个使用tidyr
中的unnest
的选项。我们使用str\u extract\u all
从库(stringr)
中提取数字部分([0-9.]+
)。输出是一个列表
。我们将列表
元素的名称设置为'testdata'的'id'列和unest
library(tidyr)
library(stringr)
res <- unnest(setNames(lapply(str_extract_all(testdata$moduler, '[0-9.]+'),
as.numeric), testdata$id), id)
colnames(res)[2] <- 'value'
head(res)
# id value
#1 2862 1.1
#2 2862 1.2
#3 2862 1.3
#4 2862 1.4
#5 2862 1.5
#6 2862 1.6
dim(res)
#[1] 136 2
@SabDeM你看到了什么?sabdemtest@SabDeM你看到了什么?安息日,谢谢-它成功了。马克·戴维斯的回答是被接受的,因为我认为这种方法更可靠。但我在这里也学到了一些东西。对我来说太好了:-)谢谢-它起作用了。马克·戴维斯的回答是被接受的,因为我认为这种方法更可靠。但我在这里也学到了一些东西。对我来说太好了:-)