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
withtextConnection
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