使用R,如何过滤列以保持项目包含在另一列中?

时间:2016-11-26 08:06:14

标签: r

我确实有像这样的数据框

columna <- c(1,2,3)
columnb <- c("a b e", "c d", "a c d")
columnc <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))
alldata <- data.frame(columna,columnb,columnc)
tokeep <- c("c", "e")

我希望修改alldatacolumnb修改columnb只保留tokeep alldata$columnb中找到的字符串。

理想情况下,我希望[ "e", "c", "c" ] 成为

filter(alldata, alldata$columnb %in% tokeep)
alldata[which(alldata$b %in% tokeep), ]

我首先想到我可以使用像

这样的东西
<DataGrid EnableRowVirtualization="True" Grid.Row="3" Grid.ColumnSpan="2" AutoGenerateColumns="False" Name="DataGrid1" IsReadOnly="False" ItemsSource="{Binding Products}" Margin="10,10,10,10" PreviewKeyDown="DataGrid1_PreviewKeyDown" SelectionChanged="DataGrid1_SelectionChanged" CellEditEnding="DataGrid1_CellEditEnding" CanUserAddRows="True" CanUserDeleteRows="True" BeginningEdit="DataGrid1_BeginningEdit" >
    <DataGrid.Columns>
        <DataGridTextColumn Header="Item Name" IsReadOnly="True" Binding="{Binding Path=ItemName}" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="Item Price" IsReadOnly="True"  Binding="{Binding Path=ItemPrice}" Width="*"></DataGridTextColumn>
            <DataGridTextColumn x:Name="QuantityColumn" Header="Quantity" IsReadOnly="False"  Binding="{Binding Path=Quantity, Mode=TwoWay}" Width="*"></DataGridTextColumn>
            <DataGridTextColumn Header="Total Price" IsReadOnly="True" Binding="{Binding Path=TotalPrice}" Width="*">
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

但我无法找到解决方案。

有人可以指导我吗?

2 个答案:

答案 0 :(得分:1)

我们可以尝试使用gsub用空字符串替换我们不想要的字符

alldata$columnb<- gsub(paste0("[^",paste0(tokeep,collapse = "|"),"]"),"", alldata$columnb)

alldata
#  columna columnb    columnc
#1       1       e 2010-11-01
#2       2       c 2008-03-25
#3       3       c 2007-03-14

我们正在创建的正则表达式是

paste0("[^",paste0(tokeep, collapse = "|"), "]")

#[1] "[^c|e]"

表示除ce以外的任何内容。

修改

根据Wiktor的评论,我们可能需要正则表达式

paste0("[^",paste0(tokeep,collapse = ""),"]")
#[1] "[^ce]"

答案 1 :(得分:1)

另一个选项是str_extract

library(stringr)
alldata$columnb <- str_extract(alldata$columnb, paste(tokeep, collapse="|"))
alldata$columnb
[#1] "e" "c" "c"