2017-02-27 81 views
0

我有一個返回固定長度向量的函數。它是不是這個功能,但認爲這是一個玩具例子:來自列的數據幀(tibble)

foo = function(letter) { 
    unlist(lapply(1:10, function (number) {paste(letter,number)})) 
} 

我的信cols = c("A", "L", "B")一個載體,我想創建一個tibble其中每列是foo(letter)

# A tibble: 10 × 3 
     A  L  B 
    <chr> <chr> <chr> 
1 A 1 L 1 B 1 
2 A 2 L 2 B 2 
3 A 3 L 3 B 3 
4 A 4 L 4 B 4 
5 A 5 L 5 B 5 
6 A 6 L 6 B 6 
7 A 7 L 7 B 7 
8 A 8 L 8 B 8 
9 A 9 L 9 B 9 
10 A 10 L 10 B 10 

上面的tibble是用data_frame("A"=foo("A"), "L"=foo("L"), "B"=foo("B"))製作的,但是我不知道如何爲任意長度的矢量cols做這件事。

我確定這是基本的,可以在沒有for循環的情況下完成。

在對手的框架是什麼我要找的是可以做到

pd.DataFrame({letter: foo(letter) for letter in cols}) 
+2

'library(purrr); c(「A」,「L」,「B」)%>%set_names()%>%map_df(foo)' – alistaire

+1

@alistaire:這正是我要找的!請發帖作爲答案,以便我可以接受 – user357269

回答

1

purrr::map_df是一個lapply版本,強制結果到一個tibble。爲了簡化數據幀,必須命名載體,爲此您可以使用set_names

library(purrr) 

c("A", "L", "B") %>% set_names() %>% map_df(foo) 

## # A tibble: 10 × 3 
##  A  L  B 
## <chr> <chr> <chr> 
## 1 A 1 L 1 B 1 
## 2 A 2 L 2 B 2 
## 3 A 3 L 3 B 3 
## 4 A 4 L 4 B 4 
## 5 A 5 L 5 B 5 
## 6 A 6 L 6 B 6 
## 7 A 7 L 7 B 7 
## 8 A 8 L 8 B 8 
## 9 A 9 L 9 B 9 
## 10 A 10 L 10 B 10 
1

我們可以使用lapply

library(dplyr) 
tbl_df(setNames(data.frame(lapply(cols, foo)), cols)) 
# A tibble: 10 × 3 
#  A  L  B 
# <fctr> <fctr> <fctr> 
#1  A 1 L 1 B 1 
#2  A 2 L 2 B 2 
#3  A 3 L 3 B 3 
#4  A 4 L 4 B 4 
#5  A 5 L 5 B 5 
#6  A 6 L 6 B 6 
#7  A 7 L 7 B 7 
#8  A 8 L 8 B 8 
#9  A 9 L 9 B 9 
#10 A 10 L 10 B 10 

或者另一種選擇是

setNames(tbl_df(matrix(foo(cols), ncol=3, byrow=TRUE)), cols) 
# A tibble: 10 × 3 
#  A  L  B 
# <chr> <chr> <chr> 
#1 A 1 L 1 B 1 
#2 A 2 L 2 B 2 
#3 A 3 L 3 B 3 
#4 A 4 L 4 B 4 
#5 A 5 L 5 B 5 
#6 A 6 L 6 B 6 
#7 A 7 L 7 B 7 
#8 A 8 L 8 B 8 
#9 A 9 L 9 B 9 
#10 A 10 L 10 B 10 

注意:只有使用。沒有額外的庫加載

+2

另一個選項'tbl_df(sapply(cols,foo,simplify = FALSE))'。主要區別在於它們是「字符」,而不是「因素」。在執行時間的四分之一處,使用'sapply'和'simplify = FALSE'與'lapply'和'setNames'調用實際上是相同的。 ('矩陣'選項不到'sapply'執行時間的一半,迄今爲止最好。) – r2evans

相關問題