首页 > 解决方案 > 如何根据 list() 中的相应值替换 dataframe() 中的值?

问题描述

我有一个列表和一个数据框。数据框有两列,一列歌曲,一列歌曲类型。我有一个歌曲列表,用于输入一首歌曲。

allsongs <- data.frame("Song" = c(1, 2, "3A", "9C", 6, 5, "12B", "32A", 18, 27, 24, "1D"),
                        "Type" = 0)

type1songs <- list(c(1, 2, "32A", 6, "1D"))

我想使用此列表将“1”的值应用于该列表中数据框中所有歌曲的 $Type。

所以它看起来像这样。

   Song Type
1     1    1
2     2    1
3    3A   NA
4    9C   NA
5     6    1
6     5   NA
7   12B   NA
8   32A    1
9    18   NA
10   27   NA
11   24   NA
12   1D    1

我怎么做?

标签: rdplyr

解决方案


我们可以使用matchor %in%-match返回匹配的位置,默认情况下nomatchNA。一旦我们得到匹配的索引,创建一个逻辑向量> 0并将其强制为二进制(+

allsongs$Type <- +(match(allsongs$Song, type1songs[[1]]) > 0)

-输出

allsongs
#    Song Type
#1     1    1
#2     2    1
#3    3A   NA
#4    9C   NA
#5     6    1
#6     5   NA
#7   12B   NA
#8   32A    1
#9    18   NA
#10   27   NA
#11   24   NA
#12   1D    1

或者一个选项data.table

library(data.table)
setDT(allsongs)[Song %in% type1songs[[1]], Type := 1]

或与base R

allsongs$Type[allsongs$Song %in% type1songs[[1]]] <- 1

推荐阅读