如何自动将列表转换为数值

How to automate the transformation of a list to numeric values

假设我在 R 中有以下 data.frame:

;Label;PennElementName;Parameter;EventTime;grupo;item;frases;tags;valores
1;minhasfrases;mouse;Move;1621714127287;A;1;Esse aviso não está vazio e eu preciso clicar logo sobre ele.;timestamps;0, 306, 321, 338, 355, 372, 388, 406, 422, 439, 455, 622, 638, 656, 705, 721, 755, 805, 822, 5189, 5206, 5223, 5238, 5255, 5271, 5288, 5305, 5321, 5338, 5355, 5371, 5388, 5405, 5488, 5505, 5521, 5538, 5555, 5572, 5588, 5605, 5622, 5655
2;minhasfrases;mouse;Move;1621714133140;A;2;Esse aviso está vazio e eu também preciso clicar sobre ele.;timestamps;0, 168, 185, 201, 219, 235, 252, 268, 285, 302, 318, 336, 352, 369, 385, 402, 418, 668, 685, 702, 720, 736, 752, 769, 835, 852, 4652, 4669, 4686, 4702, 4719, 4736, 4752, 4769, 4785, 4802, 4819, 4835, 4852, 4868, 4886, 4902, 4918, 4935, 4952, 4969, 4985, 5002, 5018, 5035
3;minhasfrases;mouse;Move;1621714127287;A;1;Esse aviso não está vazio e eu preciso clicar logo sobre ele.;xpos;864, 865, 878, 892, 896, 896, 891, 882, 882, 882, 882, 882, 879, 878, 877, 876, 875, 874, 873, 875, 897, 940, 972, 1002, 1028, 1048, 1054, 1057, 1061, 1063, 1064, 1067, 1068, 1069, 1070, 1073, 1074, 1077, 1080, 1083, 1084, 1085, 1085
4;minhasfrases;mouse;Move;1621714133140;A;2;Esse aviso está vazio e eu também preciso clicar sobre ele.;xpos;1085, 1085, 1079, 1060, 1039, 1006, 982, 960, 937, 911, 875, 855, 848, 848, 851, 855, 855, 861, 866, 871, 876, 878, 878, 879, 879, 879, 878, 847, 814, 780, 740, 702, 676, 657, 630, 611, 589, 568, 540, 518, 496, 483, 477, 473, 467, 460, 447, 435, 431, 430
5;minhasfrases;mouse;Move;1621714127287;A;1;Esse aviso não está vazio e eu preciso clicar logo sobre ele.;ypos;416, 415, 383, 339, 291, 242, 199, 167, 161, 158, 156, 156, 157, 157, 157, 158, 158, 159, 160, 192, 263, 365, 428, 492, 540, 573, 590, 597, 602, 605, 607, 611, 613, 619, 633, 647, 655, 659, 663, 668, 670, 670, 671
6;minhasfrases;mouse;Move;1621714133140;A;2;Esse aviso está vazio e eu também preciso clicar sobre ele.;ypos;671, 670, 666, 643, 615, 564, 517, 451, 374, 292, 200, 155, 126, 113, 109, 106, 105, 123, 137, 146, 154, 158, 162, 164, 166, 167, 168, 213, 256, 300, 342, 386, 419, 440, 477, 513, 546, 568, 579, 585, 591, 597, 601, 604, 613, 620, 627, 635, 639, 640

最后一列,名为“Valores”,实际上是一串字符(注意这些数据是 comma separated value,而列之间用分号分隔 - 使用 readcsv2() 加载R 中的日期)。

我想做的是自动转换最后一列的数值并使其更长table。通过使用下面的代码,我能够对具有 6 行的 table 进行转换,但我想对具有 n 行的列进行转换。这是我使用的代码:

# extracting vectors as numeric itens
for(k in 1:length(results$valores)){
  assign(paste0("obi_", k),
         as.numeric(unlist(strsplit(results$valores[[k]], split = ", "))))

  }

# defining same length of vector to cbind them 
lengths <- max(c(length(obi_1), length(obi_2), length(obi_3), length(obi_4), length(obi_5), length(obi_5)))

length(obi_1) <- lengths
length(obi_2) <- lengths
length(obi_3) <- lengths
length(obi_4) <- lengths
length(obi_5) <- lengths
length(obi_6) <- lengths

df <- data.frame(obi_1, obi_2, obi_3, obi_4, obi_5, obi_6)

# binding the transpose of the results  
results <- cbind(results, t(df))

results <- results %>%
  gather("cols", "values", '1':ncol(results)) %>%
  select(-c(valores, cols))

这是最终 table 的演示(主要列是最后几列):

,Label,PennElementName,Parameter,EventTime,grupo,item,frases,tags,values
1,minhasfrases,mouse,Move,1621714127287,A,1,Esse aviso não está vazio e eu preciso clicar logo sobre ele.,timestamps,0
2,minhasfrases,mouse,Move,1621714133140,A,2,Esse aviso está vazio e eu também preciso clicar sobre ele.,timestamps,0
3,minhasfrases,mouse,Move,1621714127287,A,1,Esse aviso não está vazio e eu preciso clicar logo sobre ele.,xpos,864
4,minhasfrases,mouse,Move,1621714133140,A,2,Esse aviso está vazio e eu também preciso clicar sobre ele.,xpos,1085
5,minhasfrases,mouse,Move,1621714127287,A,1,Esse aviso não está vazio e eu preciso clicar logo sobre ele.,ypos,416
6,minhasfrases,mouse,Move,1621714133140,A,2,Esse aviso está vazio e eu também preciso clicar sobre ele.,ypos,671
7,minhasfrases,mouse,Move,1621714127287,A,1,Esse aviso não está vazio e eu preciso clicar logo sobre ele.,timestamps,306
8,minhasfrases,mouse,Move,1621714133140,A,2,Esse aviso está vazio e eu também preciso clicar sobre ele.,timestamps,168
9,minhasfrases,mouse,Move,1621714127287,A,1,Esse aviso não está vazio e eu preciso clicar logo sobre ele.,xpos,865
10,minhasfrases,mouse,Move,1621714133140,A,2,Esse aviso está vazio e eu também preciso clicar sobre ele.,xpos,1085
11,minhasfrases,mouse,Move,1621714127287,A,1,Esse aviso não está vazio e eu preciso clicar logo sobre ele.,ypos,415
12,minhasfrases,mouse,Move,1621714133140,A,2,Esse aviso está vazio e eu também preciso clicar sobre ele.,ypos,670

我认为我最大的困难是理解如何在 for 循环之后自动化这部分代码。

我希望我能说清楚。非常感谢您的帮助。

1) 按除 valores 之外的所有列分组并使用 group_modify 扫描该列 in.

library(dplyr)

Scan <- function(x) scan(text = x, sep = ",", quiet = TRUE)

DF %>%
 group_by(across(-valores)) %>%
 group_modify(~ data.frame(valores = Scan(.$valores))) %>%
 ungroup

2) 或使用上面的扫描创建一个列表列,然后取消嵌套。

library(dplyr)
library(tidyr)

DF %>%
  rowwise %>%
  mutate(valores = list(Scan(valores))) %>%
  ungroup %>%
  unnest(valores)

备注

可重复显示的 DF 是:

Lines <- ";Label;PennElementName;Parameter;EventTime;grupo;item;frases;tags;valores
1;minhasfrases;mouse;Move;1621714127287;A;1;Esse aviso não está vazio e eu preciso clicar logo sobre ele.;timestamps;0, 306, 321, 338, 355, 372, 388, 406, 422, 439, 455, 622, 638, 656, 705, 721, 755, 805, 822, 5189, 5206, 5223, 5238, 5255, 5271, 5288, 5305, 5321, 5338, 5355, 5371, 5388, 5405, 5488, 5505, 5521, 5538, 5555, 5572, 5588, 5605, 5622, 5655
2;minhasfrases;mouse;Move;1621714133140;A;2;Esse aviso está vazio e eu também preciso clicar sobre ele.;timestamps;0, 168, 185, 201, 219, 235, 252, 268, 285, 302, 318, 336, 352, 369, 385, 402, 418, 668, 685, 702, 720, 736, 752, 769, 835, 852, 4652, 4669, 4686, 4702, 4719, 4736, 4752, 4769, 4785, 4802, 4819, 4835, 4852, 4868, 4886, 4902, 4918, 4935, 4952, 4969, 4985, 5002, 5018, 5035
3;minhasfrases;mouse;Move;1621714127287;A;1;Esse aviso não está vazio e eu preciso clicar logo sobre ele.;xpos;864, 865, 878, 892, 896, 896, 891, 882, 882, 882, 882, 882, 879, 878, 877, 876, 875, 874, 873, 875, 897, 940, 972, 1002, 1028, 1048, 1054, 1057, 1061, 1063, 1064, 1067, 1068, 1069, 1070, 1073, 1074, 1077, 1080, 1083, 1084, 1085, 1085
4;minhasfrases;mouse;Move;1621714133140;A;2;Esse aviso está vazio e eu também preciso clicar sobre ele.;xpos;1085, 1085, 1079, 1060, 1039, 1006, 982, 960, 937, 911, 875, 855, 848, 848, 851, 855, 855, 861, 866, 871, 876, 878, 878, 879, 879, 879, 878, 847, 814, 780, 740, 702, 676, 657, 630, 611, 589, 568, 540, 518, 496, 483, 477, 473, 467, 460, 447, 435, 431, 430
5;minhasfrases;mouse;Move;1621714127287;A;1;Esse aviso não está vazio e eu preciso clicar logo sobre ele.;ypos;416, 415, 383, 339, 291, 242, 199, 167, 161, 158, 156, 156, 157, 157, 157, 158, 158, 159, 160, 192, 263, 365, 428, 492, 540, 573, 590, 597, 602, 605, 607, 611, 613, 619, 633, 647, 655, 659, 663, 668, 670, 670, 671
6;minhasfrases;mouse;Move;1621714133140;A;2;Esse aviso está vazio e eu também preciso clicar sobre ele.;ypos;671, 670, 666, 643, 615, 564, 517, 451, 374, 292, 200, 155, 126, 113, 109, 106, 105, 123, 137, 146, 154, 158, 162, 164, 166, 167, 168, 213, 256, 300, 342, 386, 419, 440, 477, 513, 546, 568, 579, 585, 591, 597, 601, 604, 613, 620, 627, 635, 639, 640"
DF <- read.csv2(text = Lines)

使用tidyr::separate_rows

tidyr::separate_rows(df, valores, sep = ',\s', convert = TRUE)

# A tibble: 279 x 10
#       X Label  PennElementName Parameter  EventTime grupo  item frases    tags  valores
#   <int> <chr>  <chr>           <chr>          <dbl> <chr> <int> <chr>     <chr>   <int>
# 1     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…       0
# 2     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…     306
# 3     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…     321
# 4     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…     338
# 5     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…     355
# 6     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…     372
# 7     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…     388
# 8     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…     406
# 9     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…     422
#10     1 minha… mouse           Move         1.62e12 A         1 Esse avi… time…     439
# … with 269 more rows