web-dev-qa-db-ja.com

Rのデータフレームで2つのリストを組み合わせる

構造が異なる2つのリストがあります。

listA <- list(c("a","b","c"), c("d","e"))
listB <- list(0.05, 0.5)

listA
[[1]]
[1] "a" "b" "c"

[[2]]
[1] "d" "e"

listB
[[1]]
[1] 0.05

[[2]]
[1] 0.5

ループを使用して、以下のようなデータフレームの両方のリストを組み合わせる方法を考えていますが、これを行うにはより効率的な方法があると確信しています。

data.frame(A = c("a","b","c","d","e"), B = c(rep(0.05,3), rep(0.5,2)))
  A    B
1 a 0.05
2 b 0.05
3 c 0.05
4 d 0.50
5 e 0.50
15
Rami Al-Fahham

これは別のオプションです。

do.call(rbind, Map(data.frame, A=listA, B=listB))

#   A    B
# 1 a 0.05
# 2 b 0.05
# 3 c 0.05
# 4 d 0.50
# 5 e 0.50
21
Matthew Plourde

多分、_list2_の要素のクラスnumericを保持するよりエレガントな方法があります...しかし、これはうまくいきます

_df <- do.call(rbind,mapply(cbind, listA, listB))
df <- as.data.frame(df, stringsAsFactors = FALSE)
df[,2] <- as.numeric(df[,2])
_

[〜#〜] edit [〜#〜]Map別名mapply(data.frame, A=listA, B=listB, SIMPLIFY = FALSE)を使用したMatthew Plourdeの解ははるかに優れています

3
Rentrop

私はこれを好みます:

do.call(rbind,
        Map(function(...) setNames(cbind.data.frame(...), 
                                   c("A", "B")), 
            listA, listB))
#  A    B
#1 a 0.05
#2 b 0.05
#3 c 0.05
#4 d 0.50
#5 e 0.50
2
Roland

ここに別の方法があります:

do.call(rbind,
        lapply(1:length(listA),
               function(i)
                 data.frame(A=unlist(listA[i]),
                            B=unlist(listB[i]))))
1
zx8754

Do.callを使用しない別の方法:

cbind(data.frame(listA), data.frame(listB))
1
S.Zhong

tidyverseソリューションを探している場合、これは受け入れられた答えに類似しています。 dfrサフィックスをmap関数ファミリーに使用すると、do.call("rbind")よりも高速な非常にシンプルなソリューションが可能になります。

library(tidyverse)
listA <- list(c("a","b","c"), c("d","e"))
listB <- list(0.05, 0.5)

map2_dfr(listA, listB, ~ tibble(A = .x, B = .y))
#> # A tibble: 5 x 2
#>   A         B
#>   <chr> <dbl>
#> 1 a      0.05
#> 2 b      0.05
#> 3 c      0.05
#> 4 d      0.5 
#> 5 e      0.5

2019-02-12に reprexパッケージ (v0.2.1)によって作成されました

1
Calum You