我正在使用两个表:
t1<-data.frame(Name=c("Waldo","Mark","Harold","Earl"),Number=c(1,4,3,9))
和
t2<-data.frame(Whatever=c("does","not","really","matter","at","all"),Waldo=c(0,1,1,0,0,1),Mark=c(1,0,1,1,0,0),Harold=c(0,1,0,0,0,0),Earl=c(1,1,1,1,0,0),Extra=c("another","column","appearing","in","this","table"))
我想做的是用 t1
中的查找值替换 t2
中的1 . t2
的列名称显示为 t1
中的记录 . t2
中的所有0值应保持不变 .
在我的真实数据中, t2
中有数百列, t1
中有数百行 .
t2
中还有几个列不应受此编码的影响,但应保留在最终输出中 .
有编码的最佳做法吗?
该示例的所需输出如下:
Whatever Waldo Mark Harold Earl Extra
does 0 4 0 9 another
not 1 0 3 9 column
really 1 4 0 9 appearing
matter 0 4 0 9 in
at 0 0 0 0 this
all 1 0 0 0 table
先感谢您!
2 回答
这是一个
tidyverse
工作流程,对于此示例可能有点过量,但应该适用于较大的数据集 . 我很复杂,从宽形数据再到长到宽:首先,我将
t2
重新整形为长格式并过滤观察1:然后我使用
t1
加入t1
,以防t2
中的任何观察在t1
中没有匹配 . 这让我从t1
获得Number
列,所以现在我可以从收集中删除value
列:然后我使用
spread
将其恢复为宽格式 . 请注意,这些函数创建了对它们进行排序的因子,因此最后,扩展列按字母顺序排列 . 如果需要,可以使用select
更改列的顺序 .开始完成过程:
由reprex package(v0.2.0)创建于2018-08-14 .
这应该足够灵活,适合您的实际数据集: