我有这样的小事 -
# A tibble: 11 × 1
messycol
<chr>
1 ""
2 ""
3 ""
4 ""
5 ""
6 ""
7 "|15|16|32|33|36|39|40|41|"
8 "|15|16|32|39|"
9 "|10|29|32|38|39|40|"
10 "|32|39|"
11 ""
输出dput()
在这里 -
structure(list(messycol = structure(c("", "", "", "", "", "",
"|15|16|32|33|36|39|40|41|", "|15|16|32|39|", "|10|29|32|38|39|40|",
"|32|39|", ""), label = "Noteffectiveaccountingrule reason keys", format.sas = "$")), row.names = c(NA,
-11L), class = c("tbl_df", "tbl", "data.frame"))
我想创建一个虚拟变量,如下所示messycol
- 如果messycol
包含 15 或 16,则为 1,否则为 0。请注意,中的空白值messycol
应保持原样 -" "
所以,我的预期输出是这样的 -
# A tibble: 11 × 2
messycol DUMMY
<chr>
1 "" ""
2 "" ""
3 "" ""
4 "" ""
5 "" ""
6 "" ""
7 "|15|16|32|33|36|39|40|41|" 1
8 "|15|16|32|39|" 1
9 "|10|29|32|38|39|40|" 0
10 "|32|39|" 0
11 "" ""
一种选择是使用函数系列
string::str_split
中的一个成员purrr::map
:或者使用基础 R 你可以获得相同的结果例如像这样:
最后,另一个更详细的选项
tidyverse
是使用separate_longer_delim
:尽管已经给出了很好的答案
{dplyr}
,但我想补充一个,强调重新组织数据以供进一步分析的良好做法。Base R 缺少像 这样的函数
tidyr::separate_longer_delim()
,因此需要做更多的工作。我经常使用以下函数如何处理输出取决于结构。保留列表、先执行
list2DF()
或t
先转置等。对于你的情况,通常情况下,do.call(what="rbind")
这可能是最好的。以自然格式存储变量是一种很好的做法。因此,我们将 转换为matrix
并data.frame
应用type.convert
:给予
您可能希望按如下方式对虚拟变量进行编码。假设我们已将上述输出存储在变量中
Y
:如果
""
是附加信息,并且您希望将其编码15
或16
呈现为整数(0
,1
),我们可能会避免解析为character
。相反,我们可以使用999
。但是,当然,如果您愿意,可以replace(Y$i, Y$X1=="", 999)
改为这样做。数据