R 如何将因子转换为数据帧

R 如何将因子转换为数据帧,r,R,如何将以下因子转换为数据帧 dput(d) structure(1L, .Label = "c(\"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"C

如何将以下因子转换为数据帧

dput(d)
structure(1L, .Label = "c(\"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\", \"CONTEXTLESS\"), c(\"app1\", \"client\", \"org\", \"app1\", \"DATA_CENTER\", \"PURPOSE\", \"REGION\", \"Test\"), c(NA, \"NONE\", \"Host:Environment:test123\", \"111\", \"222\", \"GENERAL\", \"444\", \"555\")", class = "factor")


> d
[1] c("CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS"), c("app1", "client", "org", "app1", "DATA_CENTER", "PURPOSE", "REGION", "Test"), c(NA, "NONE", "Host:Environment:test123", "111", "222", "GENERAL", "444", "555")
Levels: c("CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS", "CONTEXTLESS"), c("app1", "client", "org", "app1", "DATA_CENTER", "PURPOSE", "REGION", "Test"), c(NA, "NONE", "Host:Environment:test123", "111", "222", "GENERAL", "444", "555")

也许试试这个,如果对你有用的话,告诉我。您可以作为字符进行聚合,然后为字符串放置一个公共分隔符。代码如下:

#Code
d1 <- as.character(d)
d1 <- gsub(', c','*c',d1)
d1 <- strsplit(d1,split='\\*')
df <- as.data.frame(do.call(cbind,d1))
输出:

# A tibble: 3 x 9
# Groups:   id [3]
     id Var.1      Var.2      Var.3               Var.4     Var.5     Var.6     Var.7     Var.8    
  <int> <chr>      <chr>      <chr>               <chr>     <chr>     <chr>     <chr>     <chr>    
1     1 CONTEXTLE~ CONTEXTLE~ CONTEXTLESS         CONTEXTL~ CONTEXTL~ CONTEXTL~ CONTEXTL~ CONTEXTL~
2     2 app1       client     org                 app1      DATA_CEN~ PURPOSE   REGION    Test     
3     3 NA         NONE       Host:Environment:t~ 111       222       GENERAL   444       555      
#一个tible:3 x 9
#组别:id[3]
id Var.1 Var.2 Var.3 Var.4 Var.5 Var.6 Var.7 Var.8
1 1 CONTEXTLE~CONTEXTLE~CONTEXTLESS CONTEXTL~CONTEXTL~CONTEXTL~CONTEXTL~CONTEXTL~
2 app1客户组织app1数据中心目的区域测试
3无NA主机:环境:t~111 222一般444 555

我们可以使用
str\u match\u all
提取
c(..)
之间的所有内容,在逗号上拆分字符串并绑定数据集

do.call(rbind, lapply(stringr::str_match_all(d, 'c\\((.*?)\\)'), function(x) {
  do.call(rbind, strsplit(gsub('"', '',x[, 2]), ',\\s*'))
}))

如果您从Duck的前三行代码开始,那么您可以解析R代码,它(显然)
deparse()

#Code
d1 <- as.character(d)
d1 <- gsub(', c','*c',d1)
d1 <- strsplit(d1,split='\\*')
d1[[1]][2]
#[1] "c(\"app1\", \"client\", \"org\", \"app1\", \"DATA_CENTER\", \"PURPOSE\", \"REGION\", \"Test\")"
因此:

> d2 <- setNames(lapply(d1[[1]], function(x) eval(parse(text=x))),paste0("V", 1:3))
> data.frame( d2[2:3])
           V2                       V3
1        app1                     <NA>
2      client                     NONE
3         org Host:Environment:test123
4        app1                      111
5 DATA_CENTER                      222
6     PURPOSE                  GENERAL
7      REGION                      444
8        Test                      555
d2数据帧(d2[2:3]) V2 V3 1附件1 2客户无 3组织主机:环境:test123 4附件111 5数据中心222 6一般用途 7区域444 8测试555
只需
解析
评估
数据帧(…)中的文本即可
。不需要重新发明轮子

df <- eval(parse(text = paste0("data.frame(", as.character(d), ")")))
names(df) <- paste0("v", seq_along(df))

df
as.data.frame(d)
不起作用?@RicardoSemiãoeCastro,它将everting放在一个用c(“”)括起来的框架下。我需要每个向量都在行中,您是否可以发布
d
而不是
dput
的图片?我不明白你的报告的格式data@RicardoSemiãoeCastro,好的,我也把d.no的输出放在这里,这行不通。我需要每个价值观都独立cell@user1471980您想要一个长向量还是单元格中的每个值?单元格中的每个值。在这种情况下,应该有3行8列。快速提问。我将把它应用于一个大型数据集。我希望每个c(“”)都有8个值,如果不是8个,有没有办法插入“NA”?@user1471980,因为我们正在使用
pivot\u wider()
函数理解这一点,并在没有值的地方添加
NA
!当我这样做时,它只获取数据集中的第一行。我有上千行。这行只捕获了d中的第一行,我需要将它应用于整个数据集“data@user1471980是的,我使用了
[[1]]
部分,因为
d
是长度1。如果您有大数据,我们可以使用
lappy
/
sapply
从每个列表中提取第二列。请参阅更新的答案。
> d2 <- setNames(lapply(d1[[1]], function(x) eval(parse(text=x))),paste0("V", 1:3))
> data.frame( d2[2:3])
           V2                       V3
1        app1                     <NA>
2      client                     NONE
3         org Host:Environment:test123
4        app1                      111
5 DATA_CENTER                      222
6     PURPOSE                  GENERAL
7      REGION                      444
8        Test                      555
df <- eval(parse(text = paste0("data.frame(", as.character(d), ")")))
names(df) <- paste0("v", seq_along(df))
           v1          v2                       v3
1 CONTEXTLESS        app1                     <NA>
2 CONTEXTLESS      client                     NONE
3 CONTEXTLESS         org Host:Environment:test123
4 CONTEXTLESS        app1                      111
5 CONTEXTLESS DATA_CENTER                      222
6 CONTEXTLESS     PURPOSE                  GENERAL
7 CONTEXTLESS      REGION                      444
8 CONTEXTLESS        Test                      555