3

要素purrr::map()があるかどうかをテストしてから削除するために使用したいデータフレーム内のリストがあります。NULL

sapply を使用してこれを行うことはできましたが、マップは機能しません。https://cran.r-project.org/web/packages/purrr/purrr.pdfを読みましたが、何が欠けているのかわかりません。

これが私のsapplyコードです - これはうまくいきます:

P_Trans<- P_Trans[!sapply(P_Trans$Group,is.null),] 

のために試したことがいくつかありpurrr::mapますが、うまくいきません。

試したことは以下の4つです。

a)

P_Trans %>% purrr::map(.,~is.null(Group))

b)

P_Trans %>% purrr::map(.,~is.null(.$Group))

c)

P_Trans %>% purrr::map(~is.null(.$Group))

d)

P_Trans %>% purrr::map(~is.null(Group))

誰かが私の間違いを訂正して、上記の 4 つのオプションで間違っていることを教えてもらえますか?


データ:

dput(P_Trans)

structure(list(TransactionID = c("a1", "a1", "a1", "a2", "a2", 
"a2", "a3", "a3", "a3", "a3", "a4", "a5", "a5", "a5", "a5", "a5", 
"a6", "a6", "a7"), ProductID = c("A", "B", "1", "C", "4", "5", 
"D", "C", "7", "8", "H", "1", "2", "3", "3", "1", "H", "15", 
"22"), ProductType = c(1, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 2, 2, 
2, 2, 2, 1, 2, 3), Group = list(structure(list(Group = "Group1"), .Names = "Group", row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = c("Group2", "Group3")), .Names = "Group", row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group2"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group2"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group3"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = c("Group2", "Group3")), .Names = "Group", row.names = c(NA, 
-2L), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group3"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group3"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group5"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group1"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group5"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), structure(list(
    Group = "Group5"), .Names = "Group", row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame")), NULL)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -19L), .Names = c("TransactionID", 
"ProductID", "ProductType", "Group"))
4

1 に答える 1

0

すべてのソリューションで:

  • P_Trans(アイテム/行ではなく)のすべての列をループしています
  • これらの列は原子ベクトルであり、リスト (または data.frame) には名前があり、原子ベクトルには名前がありません。names(P_Trans[[1]]) # NULL
  • 前にクラッシュしますが、data.frameではなくリストを返すつもりです
  • a は c と同じです
  • b は d と同じです

a) P_Trans %>% purrr::map(.,~is.null(Group)):

  • Group存在しない場合、現在のアイテムで検索する必要があることを示すものは何もありません。テーブルではさらに少なくなります

b)P_Trans %>% purrr::map(.,~is.null(.$Group))

  • という名前の要素を探すたびに、4つのアトミックベクトルをループしていますがGroup、何も持っていません(4番目のものでも)ので、$ operator is invalid for atomic vectors

lmap長さ1のサブリストとして列をループするのに役立ちましたが、アプローチもクラッシュし、最後のアイテムだけが( )P_Transという名前のアイテムを持っていました。Groupnames(P_Trans[4]) # "Group"

mapあなたのソリューションに相当するものはP_Trans[!map_lgl(P_Trans$Group,is.null),]、@Nateがコメントしたとおりです。これは、あなたのようなmap_lglベクトルを返すように設計されているためです。logicalsapply

欲しいものを手に入れる他の方法:

P_Trans %>% rowwise %>% filter(!is.null(Group))
P_Trans %>% filter(lengths(Group)!=0)
P_Trans[lengths(P_Trans$Group)!=0,]
于 2017-10-26T22:22:47.197 に答える