2017-07-14 10 views
0

カラム(df$list)の成分が異なる長さのリストであるデータフレーム(df)を持つと、このカラムに関数を適用して結果を新しいカラムに保存する最良の方法は何ですか?リストのリストを扱う最も効率的な方法は?

以下は私が試したことですが、データフレーム(10k行、それほど大きくない)では非常に遅いです。私はこの作業を行うためのより良い代替方法を探しています。

df$new <- apply(df, 1, FUN = function(x) myFunc(x$list)) 

例:

# constructing df & DF 
a <- c(rep("A", 3), rep("B", 3), rep("A",2)) 
b <- c(1,1,2,4,1,1,2,2) 
df <- data.frame(a,b) 

DF <- data.frame(c = c(1:8), d = c(8:1)) 
row.names(DF) <- c("A", "B", "C", "D", "E", "F", "G", "H") 

# list of lists 
df_red <- aggregate(list(track = 1:NROW(df)), df[,1:2], '[') 
df_red$list_1 <- apply(df_red, 1, FUN = function(x) row.names(DF[(x$track),])) 

# Function 
searchInDF <- function(list){DF[list,]$d} 

# apply function on a list of list 
df_red$list_2 <- apply(df_red, 1, FUN = function(x) searchInDF(x$list_1)) 
+4

再現性を指定してください例。 –

+0

異なるデータ構造を作成/変更するのが最適でしょう。リストの列はめったに良い考えではありません。 – Roland

+0

更新 – Rotail

答えて

3

ここでは、データフレームDFを作成し、カラムbの各構成要素の長さを見つけます。これは、サプリーが単純なベクトルを返すことを前提としています。

DF <- data.frame(a = 1:2) 
DF$b <- list(list("a", "b"), list("c", "d", "e")) 

DF$c <- sapply(DF$b, length) 

たり、新しい列がリスト自体である場合:

DF$c <- lapply(DF$b, rev) 

また、これらの代替案を試してみてください。

replace(DF, "c", sapply(DF$b, length)) 
replace(DF, "c", list(lapply(DF$b, rev))) 

transform(DF, c = sapply(b, length)) 

(もちろん、lengthの特定のケースでは、我々が置き換えられている可能性がsapply(...)lengths(DF$b)となります)

+0

を参照してください上記の例では 'transform(df_red、c = sapply(list_1、searchInDF))'が動作すると期待していますか? – Rotail

+1

新しい列がリストである場合に対処するための解答を改訂しました。 –

+0

ありがとうございます。彼らはすべて正常に動作しますが、私が質問で言及したように「適用する」ほど遅いです。これを引き起こす原因は不明です。私は、入力/出力についてさらに調査する必要があります。または、私が定義した方法でmyFunctionがそれを引き起こしています... – Rotail

関連する問題