2016-10-13 3 views
-1

リストからデータ・フレームを作成したいとします。特定のデータ・フレームのリスト

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 

データ

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を得ることです:私は私が得た入力を呼び出すと、リストには光沢のあるhandsontable入力から

です

# 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%")) 
+1

!元の投稿を参照してください – user2963882

答えて

3
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))) 

たくない場合はX1X2、...あなたのカラム名が、その後追加する:次にdata

colnames(data) <- paste0("col", 1:ncol(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))) 
3

試行:

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

'unlist'はデフォルトで再帰的ですので、' unlist(lapply(入力$ hot $ data、unlist)) 'は' unlist(入力$ hot $ data) 'となります。 –

2

これは私の試みです。 matrix()ですべてこれを行い、as.data.frame()で囲むことができます。ループは必要ありません(数値に変換する場合を除いて - 下の2番目の部分)。 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 
+0

< - lapply(df、type.convert、as.is = TRUE) ' –

+1

ありがとう@ EnriquePrereHerrero。それは確かに便利な機能です。 –

1

別の試み:行わ

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 
関連する問題