Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R高效地将具有字符列表的数据帧转换为具有正确R类型的列表_R_Performance_Dataframe_Lapply - Fatal编程技术网

R高效地将具有字符列表的数据帧转换为具有正确R类型的列表

R高效地将具有字符列表的数据帧转换为具有正确R类型的列表,r,performance,dataframe,lapply,R,Performance,Dataframe,Lapply,我使用crateDB将一个表作为数据帧加载到R中。问题是,crateDB将数组作为逗号分隔的字符串发送。因此,我想将所有数组转换为正确的R类型。我还想将dataframe转换为一个列表,因为它可以使用crateDB中的对象,而这不适用于dataframe。 目前这种转换速度太慢,所以我尝试了几种方法来提高性能 如果我有以下数据帧: df <- data.frame( id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), position = c( &

我使用crateDB将一个表作为数据帧加载到R中。问题是,crateDB将数组作为逗号分隔的字符串发送。因此,我想将所有数组转换为正确的R类型。我还想将dataframe转换为一个列表,因为它可以使用crateDB中的对象,而这不适用于dataframe。 目前这种转换速度太慢,所以我尝试了几种方法来提高性能

如果我有以下数据帧:

df <- data.frame(
  id = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
  position = c(
    "{\"82.81864\",\"82.586235\",\"82.35383\"}",
    "{\"83.81864\",\"83.586235\",\"83.35383\"}",
    "{\"84.81864\",\"84.586235\",\"84.35383\"}",
    "{\"85.81864\",\"85.586235\",\"85.35383\"}",
    "{\"86.81864\",\"86.586235\",\"86.35383\"}",
    "{\"87.81864\",\"87.586235\",\"87.35383\"}",
    "{\"88.81864\",\"88.586235\",\"88.35383\"}",
    "{\"89.81864\",\"89.586235\",\"89.35383\"}",
    "{\"90.81864\",\"90.586235\",\"90.35383\"}",
    "{\"91.81864\",\"91.586235\",\"91.35383\"}"
  ),
  vcontrol = c(
    "{\"t\",\"t\",\"t\",\"t\"}","{\"f\",\"f\",\"f\",\"t\"}",
    "{\"f\",\"t\",\"f\",\"t\"}", "{\"t\",\"t\",\"f\",\"t\"}",
    "{\"t\",\"t\",\"f\",\"t\"}", "{\"t\",\"f\",\"f\",\"t\"}",
    "{\"t\",\"f\",\"f\",\"t\"}", "{\"t\",\"t\",\"f\",\"t\"}",
    "{\"t\",\"t\",\"f\",\"t\"}", "{\"t\",\"t\",\"f\",\"f\"}"
  )
)

df这里有一个解决方案,使用
dplyr
在数据帧内进行正确类型的转换,然后
purrr
transpose
列表和
简化
。注意像“t”这样的“gotchas”
TRUE

库(dplyr)
图书馆(stringr)
图书馆(purrr)
x%
突变(位置=str\u替换所有(
字符串=.$位置,
模式=c(“\\{=”,“\\}=”,“\\=”)
)%%>%str_拆分(字符串=,模式=,“”)
) %>%
变异(vcontrol=str\u替换\u所有(
字符串=.$vcontrol,
模式=c(“\\{=”,“\\}=”,“\\=”)
) %>%
str_replace_all(字符串=,c(“t”=“TRUE”),
“f”=“FALSE”))%>%
str_分割(字符串=,模式=,“”)%%
行()
变异(位置=列表(如.numeric(未列出(位置)))%>%
mutate(vcontrol=list(as.logical(unlist(vcontrol)))
已转换的\u df%简化\u all()
str(转换后的测向)
#>10人名单
#>$:3人名单
#>..$id:num 1
#>..$position:num[1:3]82.8 82.6 82.4
#>..$vcontrol:logi[1:4]正确
#>$:3人名单
#>..$id:num 2
#>..$position:num[1:3]83.8 83.6 83.4
#>..$vcontrol:logi[1:4]假假真
#>$:3人名单
#>..$id:num 3
#>..$position:num[1:3]84.8 84.6 84.4
#>..$vcontrol:logi[1:4]假真假真
#>$:3人名单
#>..$id:num 4
#>..$position:num[1:3]85.8 85.6 85.4
#>..$vcontrol:logi[1:4]对错对错
#>$:3人名单
#>..$id:num 5
#>..$position:num[1:3]86.8 86.6 86.4
#>..$vcontrol:logi[1:4]对错对错
#>$:3人名单
#>..$id:num 6
#>..$position:num[1:3]87.8 87.6 87.4
#>..$vcontrol:logi[1:4]TRUE假TRUE
#>$:3人名单
#>..$id:num 7
#>..$position:num[1:3]88.8 88.6 88.4
#>..$vcontrol:logi[1:4]TRUE假TRUE
#>$:3人名单
#>..$id:num 8
#>..$position:num[1:3]89.8 89.6 89.4
#>..$vcontrol:logi[1:4]对错对错
#>$:3人名单
#>..$id:num 9
#>..$position:num[1:3]90.890.690.4
#>..$vcontrol:logi[1:4]对错对错
#>$:3人名单
#>..$id:num 10
#>..$position:num[1:3]91.891.691.4
#>..$vcontrol:logi[1:4]真假假
你的数据


df预期的最终结果是什么样的?看起来您正在增长
数据
对象,这是一个大禁忌。@RomanLuštrik最终结果如图所示。这是一个2D列表。感谢您的解决方案!如果不清楚,很抱歉,但目标是先将其转换为列表,然后再转换为正确的类型,因为它还必须适用于对象,对象将是列表中的列表。我使用了部分代码使我的代码更清晰:
convertDF=function(dataFrame,dataTypes){transposedf很乐意提供帮助。请注意,如果您有其他作为对象列表的添加列,则我的解决方案仍然有效。例如,如果您使用
obj1将10个lm摘要对象添加到示例数据中
convertDF = function(dataFrame, dataTypes){
  dimension <- dim(x = dataFrame)
  names <- names(x = dataFrame)
  
  asList <- lapply(dataFrame, as.list)
  
  for(row in seq_len(length(asList))){
    asList[[row]] <- lapply(asList[[x]], convertToRType, type = dataTypes[row])
  }
  
  data <- list()
  for(datarow in seq_len(dimension[1])){
    tempData <- list()
    for(datacol in seq_len(dimension[2])){
      tempData[[names[datacol]]] <- asList[[datacol]][[datarow]]
    }
    data[[datarow]] <- tempData
  }
  return(data)
}
  data <- str_replace_all(
    string = rawData,
    pattern = c("\\{" = "", "\\}" = "", "\"" = "")
  )
  data <- str_split(string = data, pattern = ",")[[1]]