【发布时间】: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 个。