【问题标题】:How to filter column value by another column value in R如何通过R中的另一列值过滤列值
【发布时间】:2018-01-17 20:27:01
【问题描述】:

如何从Col3 值中过滤Col2 值。例如,我只需要针对Col2 真实值返回Col2 值。

我的数据框:

Col1            Col2                                   Col3 

Check           first,second,first,four,Five          true,true,false,true,false 

预期数据框:

Col1            Col2                       

Check           first,second,four

请帮助我实现这一目标。

输入,

structure(list(Col1 = "Check", Col2 = "first,second,first,four,Five", 
    col3 = "true,true,false,true,false"), class = "data.frame", row.names = c(NA, 
-1L), .Names = c("Col1", "Col2", "col3"))

【问题讨论】:

  • data.frame 中,所有列的长度都相等。
  • @snoram,不是所有的列都有不同的长度。
  • 它们必须具有相同的行数才能成为data.frame。请使用 ´dput()` 分享您的数据。
  • @snoram,请查看上面的 dput 以获取 Ref.

标签: r dataframe filtering


【解决方案1】:

您提出的问题在R 中非常标准,但您的数据呈现方式却不是。

您的数据似乎更适合列表,因此我将首先将其转换为向量列表:

dlist <- lapply(lapply(df, strsplit, ","), unlist)
print(dlist)
$Col1
[1] "Check"

$Col2
[1] "first"  "second" "first"  "four"   "Five"  

$col3
[1] "true"  "true"  "false" "true"  "false"

然后很容易将其恢复为您的预期结果:

df2 <- data.frame(Col1 = dlist$Col1, 
                  Col2 = paste0(dlist$Col2[as.logical(dlist$col3)], collapse = ","))
print(df2)
   Col1              Col2
1 Check first,second,four

【讨论】:

    【解决方案2】:

    创建你的 data.frame "db"

    Col1<-c("Check","Check2")
    Col2<-c("first,second,first,four,Five","first,second,first,four")
    Col3<-c("true,true,false,true,false","false,true,false,true")
    
    db<-as.data.frame(cbind(Col1,Col2,Col3))
    
        Col1                         Col2                       Col3
    1  Check first,second,first,four,Five true,true,false,true,false
    2 Check2      first,second,first,four      false,true,false,true
    

    通过 Col3 过滤 Col2

    logical_value<-lapply(strsplit(as.character(db[,3]),","),as.logical)
    list_Col2<-strsplit(as.character(db[,2]),",")
    
    out<-NULL
    for (i in 1:length(list_Col2))
    {
      out[[i]]<-(unlist(list_Col2[i]))[unlist(logical_value[i])]
    }
    

    输出

    out
    [[1]]
    [1] "first"  "second" "four"  
    
    [[2]]
    [1] "second" "four"  
    

    【讨论】:

    • ,如果我有超过 100 个值表示,我如何通过更改索引值来用逗号分隔。
    • 你的意思是data.frame中有多行吗?
    • ,不是这样,如果我有真,假逗号分隔超过 100 意味着我如何执行 as.character(db[,2]),",",as.character(db[, 3])等
    • 我更改了答案,其中包含一个 data.frame,其中包含多行不同长度的 Col2 和 Col3 值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多