【问题标题】:parse conditions from a file and apply them onto a data frame从文件中解析条件并将它们应用于数据框
【发布时间】:2016-03-15 06:03:10
【问题描述】:

我请求帮助以解决我最近遇到的一个大问题。我得到一个像

这样的数据框
df <- data.frame(x=c("c1","c2","c3"),A=c(0,1,-1),B=c(2,0,1),C=c(0,-1,-1))

和具有以下条件的文件“tmp.csv”

A>0
B>1
C<0

我需要加载这些条件,解析它们并将它们应用于数据框。所以,对于 A,我期望 c1 和 c2。对于 B、c1 和对于 C、c2、c3。

我一直试图在这里找到类似的东西,但我没有。也许here 有类似的问题,但我没有得到解决方案。我也找到了函数

解析

它可能会进行解析,但即使阅读文档我也没有得到它的作用......

我真的不知道从哪里开始(解析并理解提示中的条件)。有什么帮助吗?

编辑:我在这里添加了另一个非常接近当前请求的请求。如果我需要检查哪个“cx”满足所有条件(这里只有A和B,让我们丢弃C)并且每次都没有取一个,我该怎么办?

我想简单地使用

lines <- readLines("tmp.csv")
expr <- lapply(lines, function(t) parse(text=t)[[1]])
do.call("subset", list(quote(df), expr))

但我得到错误“'子集'必须是逻辑”。

【问题讨论】:

    标签: r parsing csv conditional-statements


    【解决方案1】:

    假设您已使用 readLines 读取条件文件。这里我从 textConnection 读取而不是写入文件

    tt<-textConnection("A>0
    B>1
    C<0")
    lines <- readLines(tt)
    # lines <- readLines("tmp.csv") in your case
    

    现在我们可以用lapplyparse()将这些表达式解析成一个列表

    expr <- lapply(lines, function(t) parse(text=t)[[1]])
    

    现在我们可以使用lapplydo.callsubset 将这些应用到data.frame

    df <- data.frame(x=c("c1","c2","c3"),A=c(0,1,-1),B=c(2,0,1),C=c(0,-1,-1))
    lapply(expr, function(x) do.call("subset", list(quote(df), x)))
    
    # [[1]]
    #    x A B  C
    # 2 c2 1 0 -1
    # 
    # [[2]]
    #    x A B C
    # 1 c1 0 2 0
    # 
    # [[3]]
    #    x  A B  C
    # 2 c2  1 0 -1
    # 3 c3 -1 1 -1
    

    【讨论】:

    • 正是我要找的东西!!!绝对是我不知道的。我从来没有得到它... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多