【问题标题】:List to specific dataframe列出特定数据框
【发布时间】:2016-10-13 17:31:28
【问题描述】:

我想从列表中创建一个数据框。该列表来自一个闪亮的可动手操作的输入

当我调用我得到的输入时:

unlist(input$hot$data)

                                    texta
2                                     80%
3                                    100%
4                                    100%
5                                    100%
6                                   textb
7                                    100%
8                                    100%
9                                    100%
10                                   100%
11                                  textc
12                                    80%
13                                   100%
14                                   100%
15                                   100%
16                                  textd
17                                     5%
18                                    95%
19                                   100%
20                                    35%

我想要得到一个像这样的df:

col1  col2 col3 col4 col5
texta 80   100  100  100
textb 100  100  100  100
textc 80   100  100  100
textd 5    95   100  35

数据

# output dput(input$hot$data)
list(list("texta", "80%", "100%", "100%", "100%"), list(
    "textb", "100%", "100%", "100%", "100%"), list(
    "textc", "80%", "100%", "100%", "100%"), list("textd", 
    "5%", "95%", "100%", "35%"))

【问题讨论】:

  • 完成!见原帖

标签: r shiny rhandsontable


【解决方案1】:
data <- list(list("texta", "80%", "100%", "100%", "100%"), list(
    "textb", "100%", "100%", "100%", "100%"), list(
    "textc", "80%", "100%", "100%", "100%"), list("textd", 
    "5%", "95%", "100%", "35%"))

data <- data.frame(t(sapply(data, unlist)))

如果不希望 X1, X2, ... 作为列名,请添加:

colnames(data) <- paste0("col", 1:ncol(data))
data

那么data就是下面的data.frame

    col1 col2 col3 col4 col5
 1 texta  80% 100% 100% 100%
 2 textb 100% 100% 100% 100%
 3 textc  80% 100% 100% 100%
 4 textd   5%  95% 100%  35%

如果您想删除 % 符号并将您的数值转换为数字,那么:

data[,-1] <- sapply(data[,-1], function(x) as.numeric(sub("%", "", x)))

【讨论】:

    【解决方案2】:

    试试:

    out <- as.data.frame(t(matrix(unlist(lapply(input$hot$data,  unlist)),
                         nrow = length(input$hot$data[[1]]))))
    

    【讨论】:

    • unlist 默认是递归的,所以unlist(lapply(input$hot$data, unlist)) 可能只是unlist(input$hot$data)
    【解决方案3】:

    这是我的尝试。您可以在matrix() 中完成所有这些操作并在as.data.frame() 中进行包装。不需要循环(除非您想转换为数字 - 下面的第二部分)。将x 视为您的给定列表。

    ## create a data frame from the unlisted values with '%' removed
    df <- as.data.frame(
        matrix(
            sub("%", "", unlist(x), fixed = TRUE), 
            length(x),
            byrow = TRUE, 
            dimnames = list(NULL, paste0("col", 1:lengths(x)[[1]]))
        ),
        stringsAsFactors = FALSE
    )
    ## convert the character numbers to numeric
    df[] <- lapply(df, type.convert, as.is = TRUE)
    ## result
    df
       col1 col2 col3 col4 col5
    1 texta   80  100  100  100
    2 textb  100  100  100  100
    3 textc   80  100  100  100
    4 textd    5   95  100   35
    

    【讨论】:

    • 我喜欢这个df[] &lt;- lapply(df, type.convert, as.is = TRUE)
    • 感谢@EnriquePérezHerrero。这当然是一个方便的功能。
    【解决方案4】:

    另一个尝试:

    d <- setNames(data.frame(matrix(sub("%","",unlist(l)), ncol = 5, byrow = T)), 
              paste0("col", 1:5))
    
    #   col1 col2 col3 col4 col5
    #1 texta   80  100  100  100
    #2 textb  100  100  100  100
    #3 textc   80  100  100  100
    #4 textd    5   95  100   35
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2017-08-17
      • 2012-04-22
      相关资源
      最近更新 更多