R将数组拆分为数据帧

时间:2018-07-28 16:19:55

标签: r

R的新手,正努力知道要问些什么,在这里也发现了类似的问题 How to split a character vector into data frame? 但这长度是固定的,我一直无法适应我的问题

我在R的数组中有一些数据

TEST <- c("Value01:100|Value02:200|Value03:300|","Value04:1|Value05:2|",
            "StillAValueButNamesAreNotConsistent:12345.6789|",
              "AlsoNotAllLinesAreTheSameLength:1|")

数据成对存储,我希望将其拆分成一个数据框:

Variable Value
Value01    100
Value02    200
Value03    300
Value04    1
Value05    2
StillAValueButNamesAreNotConsistent   12345.6789
AlsoNotAllLinesAreTheSameLength     1

变量名称是一个字符串,并且值始终是数字

任何帮助都会很棒!

谢谢

5 个答案:

答案 0 :(得分:5)

一个人可以使用基于?- append([[1,2],[3]],X). % append/2 - Concatenate a list of lists. X = [1, 2, 3]. ?- append([4],[5],X). % append/3 - X is the concatenation of List1 and List2 X = [4, 5]. 的解决方案。将向量tidyr转换为data.frame并从每一行中删除最后一个TEST,因为它没有任何意义。

现在,使用|基于tidyr::separate_rows扩展行,然后使用|函数将数据分为2列。

tidyr::separate

答案 1 :(得分:5)

我们可以在基数R中用一行完成它。只需将|字符更改为换行符,然后将:用作sep中的read.table()值。您也可以在此处设置列名称。

read.table(text = gsub("\\|", "\n", TEST), sep = ":", 
    col.names = c("Variable", "Value"))

#                              Variable    Value
# 1                             Value01   100.00
# 2                             Value02   200.00
# 3                             Value03   300.00
# 4                             Value04     1.00
# 5                             Value05     2.00
# 6 StillAValueButNamesAreNotConsistent 12345.68
# 7     AlsoNotAllLinesAreTheSameLength     1.00

答案 2 :(得分:0)

使用基本R:

(我已经分解了每个步骤,希望可以使代码清晰明了)

 Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA);

答案 3 :(得分:0)

lst <- strsplit(unlist(strsplit(TEST,'\\|')),':')

lst_df <- data.frame(matrix(unlist(l), nrow=length(l), byrow=T))

colnames(lst_df) <- c("Variable", "Value")

                                               Variable      Value
                  1                             Value01        100
                  2                             Value02        200
                  3                             Value03        300
                  4                             Value04          1
                  5                             Value05          2
                  6 StillAValueButNamesAreNotConsistent 12345.6789
                  7     AlsoNotAllLinesAreTheSameLength          1

答案 4 :(得分:0)

借助strsplitunlist函数。每个命令在下面显示,并带有输出。

输入

 TEST
 # [1] "Value01:100|Value02:200|Value03:300|"           
 # [2] "Value04:1|Value05:2|"                           
 # [3] "StillAValueButNamesAreNotConsistent:12345.6789|"
 # [4] "AlsoNotAllLinesAreTheSameLength:1|"             

先按|再按:

 my_list <- strsplit(unlist(strsplit(TEST, "|", fixed = TRUE)), ":", fixed = TRUE)
 my_list
 # [[1]]
 # [1] "Value01" "100"    

 # [[2]]
 # [1] "Value02" "200"    

 # [[3]]
 # [1] "Value03" "300"    

 # [[4]]
 # [1] "Value04" "1"      

 # [[5]]
 # [1] "Value05" "2"      

 # [[6]]
 # [1] "StillAValueButNamesAreNotConsistent" "12345.6789"                         

 # [[7]]
 # [1] "AlsoNotAllLinesAreTheSameLength" "1"                              

将以上列表转换为data.frame

 df <- data.frame(matrix(unlist(my_list), ncol = 2, byrow=TRUE))
 df
 #                                    X1         X2
 # 1                             Value01        100
 # 2                             Value02        200
 # 3                             Value03        300
 # 4                             Value04          1
 # 5                             Value05          2
 # 6 StillAValueButNamesAreNotConsistent 12345.6789
 # 7     AlsoNotAllLinesAreTheSameLength          1

数据框的名称

 names(df) <- c("Variable", "Value")
 df
 #                              Variable      Value
 # 1                             Value01        100
 # 2                             Value02        200
 # 3                             Value03        300
 # 4                             Value04          1
 # 5                             Value05          2
 # 6 StillAValueButNamesAreNotConsistent 12345.6789
 # 7     AlsoNotAllLinesAreTheSameLength          1