【发布时间】:2017-11-12 05:17:08
【问题描述】:
我使用jsonlite 扁平化了 json 数据,并添加了一些奇异的列名称。请参阅下面的示例数据:
df <- data.frame("ID" = c(1,2,3,4))
df$`events.location.John.round.1` =
list(list("A","B","C"),list("B","C","E"),list("A","C"),list("D","E","B"))
df$`events.location.John.round.2` =
list(list("A","D","E"),NA,list("B","C"),list("B","E","C"))
df$`events.location.Mary.round.1` = list(NA,NA,list("B","C"),list("E","A"))
df$`events.location.Mary.round.2` = list(list("A","B","E"),NA,list("B","A"),list("D","E","C"))
LocationList <- c("A","B","C","D","E")
PersonList <- c("John", "Mary")
我想遍历我的位置和人员列表,以在我的数据框中生成新变量。这是一些示例输出:
df$`NumLocationsJohnRound1` = c(3,3,2,3)
df$`NumLocationsMaryRound1` = c(0,0,2,2)
df$`B.JohnRound1` = c(1,1,0,1)
df$`B.MaryRound1` = c(0,0,1,0)
在英语中,第一个操作是“对于 PersonList 中的每个人,查找包含人名和可能其他文本的列名,并返回该单元格列表的长度”
第二个操作是“对于 PersonList 中的每个人,查找包含该人姓名的列名,并为 LocationList 中的每个位置创建一个新的二进制字段,如果该列包含该字段,则为 1位置。
基本上,我需要的所有新变量要么将函数应用于匹配列,要么在单元格中的列表中搜索某个值。这里的关键是迭代列表、按名称查找列以及根据列表生成新列的灵活方法。
我认为解决方案取决于Regex/grep(),但我不知道如何将列表项插入正则表达式字符串(可能使用paste?)。 select(contains()) 可能是其中的步骤之一。
解决方案可能涉及purrr::map()、dplyr::mutate(),或者可能涉及这些的自定义函数。我想避免完全依赖 for 循环。
我知道这是一个具有挑战性的问题。深入了解其中的任何部分(如何查找名称中包含列表项的列,如何根据列表项创建具有名称的新列,如何搜索列表列)会很有帮助。
【问题讨论】: