R 将任意列拆分为数据帧

R 将任意列拆分为数据帧,r,lapply,tidyr,R,Lapply,Tidyr,我有一个data.frame,它有一个丑陋的列,包含结构化数据。每列可以容纳1到40个感兴趣的值。每个值都用html分隔符“”。以1.1形式提取的值,即一个整数、一个周期和另一个整数 如何将这些列分隔并合并成不同的行? 我知道拉普拉和迪迪很可能是分开的方式。但我还没有成功。所以请求帮助 测试数据如下: testdata <- dget("http://pastebin.com/download.php?i=VS2cq2rB") 这是我最近的一次尝试——与我从lapply开始的时候相去甚远

我有一个data.frame,它有一个丑陋的列,包含结构化数据。每列可以容纳1到40个感兴趣的值。每个值都用html分隔符

。以
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你看到了什么?安息日,谢谢-它成功了。马克·戴维斯的回答是被接受的,因为我认为这种方法更可靠。但我在这里也学到了一些东西。对我来说太好了:-)谢谢-它起作用了。马克·戴维斯的回答是被接受的,因为我认为这种方法更可靠。但我在这里也学到了一些东西。对我来说太好了:-)