2017-02-27 185 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