2016-09-06 58 views
1

我有data.frame,如下:如何根據data.frame中的列訪問data.frame內的列表成員?

x <- structure(list(tsv_level = c(2, 3, 2, 3, 2, 2), tsv_payout = structure(list(
    c(0, 700, 1400, 2100, 2800), c(0, 300, 600, 900, 1200), c(0, 
    300, 600, 900, 1200), c(0, 3000, 6000, 9000, 12000), c(0, 
    700, 1400, 2100, 2800), c(0, 1000, 2000, 3000, 4000)), class = "AsIs")), .Names = c("tsv_level", 
"tsv_payout"), row.names = c(NA, -6L), class = c("tbl_df", "tbl", 
"data.frame")) 

我想創建一個返回內tsv_payout每個列表的tsv_levelth元素的第三列。

我可以單獨做第1行的x$tsv_payout[[1]][2]x$tsv_payout[[2]][3]第2行,但我怎樣才能做到這一點data.frame中的所有行?

回答

3

您可以 「隱藏」 與

x$v = with(x, mapply(`[[`, tsv_payout, tsv_level)) 

transform類似的循環。

+0

謝謝!那工作。是否有可能在dplyr/mutate中寫入?這一步是我正在執行的一系列mutate命令。 – pedram

+1

@multiphrenic我這麼認爲。 'x%>%mutate(v = mapply(\'[[\',tsv_payout,tsv_level))似乎有效。我不確定關於列表列的dplyr理念是什麼,但是你可能想看看其他相關的軟件包(比如tidyr對列表列有某種「unnest」,並且purrr與列表有關......我只是知道dplyr我自己)。 – Frank

+0

謝謝弗蘭克,我可以與之合作。看起來'rowwise()'在這裏也可能有所幫助:「ts的主要影響是允許你在不需要使用[[1]]的情況下使用列表變量進行彙總和變異,這使得總結了行列式tbl實際上等同於plyr的低價。「 – pedram

1

弗蘭克的答案的作品,只依賴於基地R,但它也看起來像dplyr包中的rowwise()將在這裏工作。

x %>% rowwise() %>% 
    mutate(v = tsv_payout[tsv_level]) 
1

不如@弗蘭克的解決方案,但它也做了工作:

x$v <- sapply(seq_along(x$tsv_level), function(i) x$tsv_payout[[i]][x$tsv_level[i]]) 
相關問題