Home > other >  Convert string into data frame
Convert string into data frame

Time:08-12

I have a string like this

response <- "q1=2,q2=3,q3=4,q4=5,q5=0,q6=4,q7=6,q31=3,q32=5,q33=5,q34=1,q35=3,q36=6,q37=4,q38=3,q39=5,q40=5,q41=1,q42=5,q43=4,q44=3,q45=5,q46=6,q47=0,q48=4,q49=2,q50=4,q51=6,q52=5,q53=4,q8=3,q9=0,q10=2,q11=4,q12=6,q13=5,q54=1,q55=2,q56=3,q57=1,q58=2,q59=3,q60=0,q61=1,q14=2,q15=4,q16=6,q62=3,q63=2,q64=2,q65=5,q66=6,q17=3,q18=3,q19=1,q20=4,q21=6,q67=1,q68=2,q69=2,q70=4,q71=4,q72=5,q73=6,q74=5,q75=4,q76=3,q77=2,q78=1,q79=0,q80=2,q81=6,q82=5,q83=4,q84=5,q22=2,q23=4,q24=5,q25=1,q26=2,q85=1,q86=0,q87=2,q88=5,q89=3,q90=6,q91=1,q92=0,q93=5,q94=4,q95=3,q96=1,q97=2,q98=3,q99=4,q100=4,q101=5,q102=6,q103=2,q104=1,q105=4,q106=3,q107=2,q108=1,q109=6,q110=0,q111=4,q112=5,q113=4,q114=3,q115=5,q116=4,q117=6,q118=0,q119=3,q120=4,q121=2,q122=4,q123=3,q124=5,q125=6,q126=4,q127=3,q128=4,q129=5,q130=6,q131=4,q27=5,q28=3,q29=6,q30=5,q132=1,q133=0,q134=3,q135=4,q136=6,q137=2,q138=1,q139=5"

I want to convert it in such a way that whatever is before = sign becomes column heading and whatever is after becomes column value. Something like what I get if I do this

df <- data.frame('key'='value','key2'='value2')

How can I do this with a string like that?

Please forgive my ignorance, I am struggling with this and could not find an answer in R.

CodePudding user response:

You could insert response into data.frame(...), then parse & evaluate it.

df <- eval(parse(text = paste0("data.frame(", response, ")")))

dim(df)
# [1]   1 139

df[1:10]
#   q1 q2 q3 q4 q5 q6 q7 q31 q32 q33
# 1  2  3  4  5  0  4  6   3   5   5

CodePudding user response:

You could use strsplit to separate the values with a reprex. Then the data is easiest separable in the long format and you can transform it with pivot_wider into the wide format you want.

response <- "q1=2,q2=3,q3=4,q4=5,q5=0,q6=4,q7=6,q31=3,q32=5,q33=5,q34=1,q35=3,q36=6,q37=4,q38=3,q39=5,q40=5,q41=1,q42=5,q43=4,q44=3,q45=5,q46=6,q47=0,q48=4,q49=2,q50=4,q51=6,q52=5,q53=4,q8=3,q9=0,q10=2,q11=4,q12=6,q13=5,q54=1,q55=2,q56=3,q57=1,q58=2,q59=3,q60=0,q61=1,q14=2,q15=4,q16=6,q62=3,q63=2,q64=2,q65=5,q66=6,q17=3,q18=3,q19=1,q20=4,q21=6,q67=1,q68=2,q69=2,q70=4,q71=4,q72=5,q73=6,q74=5,q75=4,q76=3,q77=2,q78=1,q79=0,q80=2,q81=6,q82=5,q83=4,q84=5,q22=2,q23=4,q24=5,q25=1,q26=2,q85=1,q86=0,q87=2,q88=5,q89=3,q90=6,q91=1,q92=0,q93=5,q94=4,q95=3,q96=1,q97=2,q98=3,q99=4,q100=4,q101=5,q102=6,q103=2,q104=1,q105=4,q106=3,q107=2,q108=1,q109=6,q110=0,q111=4,q112=5,q113=4,q114=3,q115=5,q116=4,q117=6,q118=0,q119=3,q120=4,q121=2,q122=4,q123=3,q124=5,q125=6,q126=4,q127=3,q128=4,q129=5,q130=6,q131=4,q27=5,q28=3,q29=6,q30=5,q132=1,q133=0,q134=3,q135=4,q136=6,q137=2,q138=1,q139=5"

response_split <- strsplit(response, split = "[=,]")

df_long <- data.frame(
  names = response_split[[1]][seq(from = 1, to = length(response_split[[1]]), by = 2)],
  values = response_split[[1]][seq(from = 2, to = length(response_split[[1]]), by = 2)]
)

library(tidyr)
df <- pivot_wider(
  df_long,
  names_from = names,
  values_from = values
)

dim(df)
#> [1]   1 139

Created on 2022-08-12 by the reprex package (v1.0.0)

CodePudding user response:

A base R option would be to first split your string in variables names and the values and putting them in separate vectors. Afterwards put the values in a matrix and convert to a dataframe:

resp_split <- strsplit(response, split = ",")[[1]] |> strsplit(split = "=")

vars <- sapply(resp_split, `[[`, 1)
vals <- sapply(resp_split, `[[`, 2)

df <- data.frame(matrix(vals, nrow = 1, dimnames = list(1, vars)))

dim(df)
#> [1]   1 139

str(df)
#> 'data.frame':    1 obs. of  139 variables:
#>  $ q1  : chr "2"
#>  $ q2  : chr "3"
#>  $ q3  : chr "4"
#>  $ q4  : chr "5"
#>  $ q5  : chr "0"
#>  $ q6  : chr "4"
#>  $ q7  : chr "6"
#>  $ q31 : chr "3"
#>  $ q32 : chr "5"
#>  $ q33 : chr "5"
#>  $ q34 : chr "1"
#>  $ q35 : chr "3"
#>  $ q36 : chr "6"
#>  $ q37 : chr "4"
#>  $ q38 : chr "3"
#>  $ q39 : chr "5"
#>  $ q40 : chr "5"
#>  $ q41 : chr "1"
#>  $ q42 : chr "5"
#>  $ q43 : chr "4"
#>  $ q44 : chr "3"
#>  $ q45 : chr "5"
#>  $ q46 : chr "6"
#>  $ q47 : chr "0"
#>  $ q48 : chr "4"
#>  $ q49 : chr "2"
#>  $ q50 : chr "4"
#>  $ q51 : chr "6"
#>  $ q52 : chr "5"
#>  $ q53 : chr "4"
#>  $ q8  : chr "3"
#>  $ q9  : chr "0"
#>  $ q10 : chr "2"
#>  $ q11 : chr "4"
#>  $ q12 : chr "6"
#>  $ q13 : chr "5"
#>  $ q54 : chr "1"
#>  $ q55 : chr "2"
#>  $ q56 : chr "3"
#>  $ q57 : chr "1"
#>  $ q58 : chr "2"
#>  $ q59 : chr "3"
#>  $ q60 : chr "0"
#>  $ q61 : chr "1"
#>  $ q14 : chr "2"
#>  $ q15 : chr "4"
#>  $ q16 : chr "6"
#>  $ q62 : chr "3"
#>  $ q63 : chr "2"
#>  $ q64 : chr "2"
#>  $ q65 : chr "5"
#>  $ q66 : chr "6"
#>  $ q17 : chr "3"
#>  $ q18 : chr "3"
#>  $ q19 : chr "1"
#>  $ q20 : chr "4"
#>  $ q21 : chr "6"
#>  $ q67 : chr "1"
#>  $ q68 : chr "2"
#>  $ q69 : chr "2"
#>  $ q70 : chr "4"
#>  $ q71 : chr "4"
#>  $ q72 : chr "5"
#>  $ q73 : chr "6"
#>  $ q74 : chr "5"
#>  $ q75 : chr "4"
#>  $ q76 : chr "3"
#>  $ q77 : chr "2"
#>  $ q78 : chr "1"
#>  $ q79 : chr "0"
#>  $ q80 : chr "2"
#>  $ q81 : chr "6"
#>  $ q82 : chr "5"
#>  $ q83 : chr "4"
#>  $ q84 : chr "5"
#>  $ q22 : chr "2"
#>  $ q23 : chr "4"
#>  $ q24 : chr "5"
#>  $ q25 : chr "1"
#>  $ q26 : chr "2"
#>  $ q85 : chr "1"
#>  $ q86 : chr "0"
#>  $ q87 : chr "2"
#>  $ q88 : chr "5"
#>  $ q89 : chr "3"
#>  $ q90 : chr "6"
#>  $ q91 : chr "1"
#>  $ q92 : chr "0"
#>  $ q93 : chr "5"
#>  $ q94 : chr "4"
#>  $ q95 : chr "3"
#>  $ q96 : chr "1"
#>  $ q97 : chr "2"
#>  $ q98 : chr "3"
#>  $ q99 : chr "4"
#>  $ q100: chr "4"
#>  $ q101: chr "5"
#>  $ q102: chr "6"
#>  $ q103: chr "2"
#>   [list output truncated]

CodePudding user response:

here you go:

response <- strsplit(response, ",")[[1]]
response <- strsplit(response, "=")
dat <- matrix(as.numeric(sapply(response, `[`, 2)), nrow= 1)
colnames(dat) <- sapply(response, `[`, 1)
dat <- as.data.frame(dat)

However, I would advise you to work with a two columns data.frame instead :)

CodePudding user response:

  • Another option using read.table with textConnection to read the string
df <- read.table(textConnection(gsub("," , "\n" , response)) , header = F , sep = "=")

ans <- data.frame(matrix(df$V2 , nrow = 1))

colnames(ans) <- df$V1
  • output
ans
   q1 q2 q3 q4 q5 q6 q7 q31 q32 q33 q34 q35 q36 q37 q38 q39 q40 q41
1  2  3  4  5  0  4  6   3   5   5   1   3   6   4   3   5   5   1
  q42 q43 q44 q45 q46 q47 q48 q49 q50 q51 q52 q53 q8 q9 q10 q11 q12
1   5   4   3   5   6   0   4   2   4   6   5   4  3  0   2   4   6
  q13 q54 q55 q56 q57 q58 q59 q60 q61 q14 q15 q16 q62 q63 q64 q65 q66
1   5   1   2   3   1   2   3   0   1   2   4   6   3   2   2   5   6
  q17 q18 q19 q20 q21 q67 q68 q69 q70 q71 q72 q73 q74 q75 q76 q77 q78
1   3   3   1   4   6   1   2   2   4   4   5   6   5   4   3   2   1
  q79 q80 q81 q82 q83 q84 q22 q23 q24 q25 q26 q85 q86 q87 q88 q89 q90
1   0   2   6   5   4   5   2   4   5   1   2   1   0   2   5   3   6
  q91 q92 q93 q94 q95 q96 q97 q98 q99 q100 q101 q102 q103 q104 q105
1   1   0   5   4   3   1   2   3   4    4    5    6    2    1    4
  q106 q107 q108 q109 q110 q111 q112 q113 q114 q115 q116 q117 q118
1    3    2    1    6    0    4    5    4    3    5    4    6    0
  q119 q120 q121 q122 q123 q124 q125 q126 q127 q128 q129 q130 q131
1    3    4    2    4    3    5    6    4    3    4    5    6    4
  q27 q28 q29 q30 q132 q133 q134 q135 q136 q137 q138 q139
1   5   3   6   5    1    0    3    4    6    2    1    5

  • Related