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))
dfas.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