【问题标题】:Subset dataframe in R conditional on two values in paired listR中的子集数据帧以配对列表中的两个值为条件
【发布时间】:2020-06-09 07:43:02
【问题描述】:

我有一个数据框,其中包含执行任务 6 次的多个参与者。 例如。数据如下所示:

    subject blockN
1        133      1
17       133      2
33       133      3
49       133      4
65       133      5
81       133      6
97       134      1
113      134      2
129      134      3
145      134      4
161      134      5
177      134      6
193      135      1
209      135      2
225      135      3
241      135      4
257      135      5
273      135      6
289      136      1
305      136      2

此外,我还有一个我需要排除参与者试验的配对列表(名为 excludeTrials):

[1] 133   5

[[2]]
[1] 135   1

[[3]]
[1] 135   1

[[4]]
[1] 140   1

现在我尝试根据这些值对数据框进行子集化。我想避免循环它,所以我尝试用 sapply 解决它: df[df$subject %in% sapply(excludeTrials, "[[", 1) & df$blockN %in% sapply(excludeTrials, "[[", 2) ]

subset(df, !( (df$subject %in% sapply(excludeTrials, "[[", 1)) & (df$blockN %in% sapply(excludeTrials, "[[", 2)) ) )

问题在于,在这一行中,它忽略了两个值必须位于同一行中的事实,并且逻辑运算符为所有块 (1-6) 中的第一个元素中的任何参与者给出TRUE列表。

有没有可能在没有循环的情况下解决它?

编辑:

structure(list(subject = structure(c(2L, 2L, 2L, 2L, 2L, 2L), .Label = c("133", 
"134", "135", "136", "139", "140", "142", "143", "144", "145", 
"146", "148", "149", "150", "151", "152", "153", "154", "155", 
"156", "157", "158", "159", "160", "161", "162", "163", "164", 
"165", "166", "167", "168", "169", "171", "172", "173", "174", 
"175", "176", "177", "178", "179", "180", "181", "182", "183", 
"184", "185", "186", "187", "188", "189", "190", "191", "192", 
"194", "195", "196", "197", "198", "199", "200", "201", "202", 
"203", "204", "205", "206", "207", "208", "209", "211", "212", 
"213", "214", "215", "216", "217", "219", "220", "221", "222", 
"223", "224", "225", "226", "227", "228", "229", "230", "232", 
"233", "234", "235", "237", "238", "239", "240", "241", "242", 
"243", "244", "245", "246", "247", "248", "249", "250", "251", 
"252", "253", "254", "255", "256", "257", "258", "259", "260", 
"261", "262", "263", "264", "265", "266", "267", "268", "269", 
"270", "271", "272", "273", "274", "275", "276", "277", "278", 
"279", "280", "281", "282", "283", "284", "285", "286", "287", 
"288", "289", "290", "292", "293", "294", "295", "296", "297", 
"298", "299", "300", "301", "302", "303", "304", "305", "306", 
"307", "308", "309", "310", "311", "312", "313", "314", "315", 
"316", "317", "318", "319", "320", "321", "322", "323", "324", 
"325", "326", "327", "328", "329", "330", "331", "332", "333", 
"334", "335", "336", "337", "338", "339", "340", "341", "342", 
"343", "344", "345", "346", "347", "348", "349", "350", "351", 
"352", "353", "354", "355", "356", "357", "358", "359", "360"
), class = "factor"), blockN = c(1, 2, 3, 4, 5, 6)), row.names = c(97L, 
113L, 129L, 145L, 161L, 177L), class = "data.frame")

dput(head(excludeTrials))
list(c(133, 5), c(135, 1), c(135, 1), c(140, 1), c(145, 5), c(146, 
2))

【问题讨论】:

  • 请使用dput( mydata )创建您的示例数据。您会得到更好的答案
  • 如果您将excludeTrials 列表转换为具有适当列名的数据框,则可以使用dplyr::anti_join(df, excludeTrials)。有关更多想法,请参阅How to get the complement of a data frame - 尽管某些答案只能匹配单个列,而不是像您那样的 2 个。

标签: r dataframe subset


【解决方案1】:

excludeTrials 转换为两列数据框,然后使用dplyr 中的anti_join

mat <- setNames(do.call(rbind.data.frame, excludeTrials), names(df))
mat$subject <- factor(mat$subject)
dplyr::anti_join(df, mat)

【讨论】:

  • 感谢您的回答。尽管我尝试了这两个版本,但对我来说,它们仍然排除了整个参与者。它对您有效但对我无效的原因可能是什么?
  • @carina__u 您能否展示您对共享示例的预期输出?
  • 预期的输出将是你写的:# subject blockN #17 133 2 #33 133 3 #49 133 4 #81 133 6 #97 134 1 #113 134 2 #129 134 3 #145 134 4 #161 134 5 #177 134 6 #209 135 2 #225 135 3 #241 135 4 #273 135 6 我得到的是:97 134 1 113 134 2 129 134 3 145 134 4 161 134 5 177 1 3 136 1 305 136 2
  • 在这种情况下,您可以编辑您的帖子以包含dput(df)dput(excludeTrials),就像我在答案中添加的那样?也许你有一些不同的数据结构。
  • 我从 dput() 得到的内容对于我的控制台来说也太长了。这种情况我该怎么办?
猜你喜欢
  • 2020-11-10
  • 1970-01-01
  • 2018-11-12
  • 2019-10-22
  • 2020-04-07
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多