【问题标题】:Reading a csv file as matrix and change the entries using conditional if in R将 csv 文件读取为矩阵并在 R 中使用条件 if 更改条目
【发布时间】:2021-10-17 22:51:09
【问题描述】:

我有 csv 文件,我想将其作为数据框或矩阵读取。我成功读取了 .csv 文件,但是当我想根据条件 if 语句更改条目时,它不起作用。 csv文件可以在这里下载mydata

我想将此 .csv 文件作为矩阵或数据框读取。然后,我想根据某些条件将条目更改为“YES”或“NO”。我试过这个:

mydata = read.csv("mydata.csv")
mydata = data.frame(mydata)
ifelse(mydata>0.005, "YES", "NO")
mydata

但是,我得到的结果是

我试过了

mydata = 
read.csv("/home/hudamoh/scRNAspatial/binomial/tangram_output.csv")
myresult = data.frame(mydata)
myresult[myresult>0.0005] <- "YES"
myresult[myresult<=0.0005] <- "NO"
myresult

但我得到的输出是有些没有更改为“YES”或“NO”。我也希望它看起来像矩阵,其中行应该是 0、1、9。请帮忙。

【问题讨论】:

    标签: r csv if-statement conditional-statements


    【解决方案1】:

    试试这个:

    myresult <- as.data.frame(lapply(mydata, function(v) ifelse(v > 0.005, "YES", "NO")))
    

    请注意,这里的mydata 不是一个数组,而是一个数据框,即带有data.frame 类的向量列表。以上将ifelse 应用于每一列。

    或者,也可以一次将ifelse 应用于整个数据帧。然而,结果不是数据帧而是矩阵:数据帧首先被转换为矩阵,以便能够将ifelse 应用于所有矩阵元素的向量,而您不能直接使用数据帧执行此操作。然后,您可以将结果转换回数据框:

    myresult <- as.data.frame(ifelse(mydata > 0.0005, "YES", "NO"))
    

    请注意,您的数据框有 3468 列。 read.csv 函数默认假定第一行包含变量名。因为它们是数字,所以 R 在前面加上一个 X,因此出现了奇怪的 Xnnnn。如果第一行包含数据,则传递一个选项:

    read.csv("mydata.csv", header = F)
    

    变量名则为 V1、V2...V3468。

    【讨论】:

    • 我试过了,确实显示变量名是 V1,...,V3467。它仍然显示错误的结果。我真正想要的是行名称为 0、1、...、9 且列名称为 0、2、...、3467 的结果,例如 dropbox.com/s/2zzm7ku7uizv8f6/result.png?dl=0,但基于此,条目为 YES 或 No提到的条件。我仍然不明白为什么在我的 R 函数中运行代码时它不起作用。
    • 第一行包含变量名是什么意思?你是说第一列吗?
    • @MKHuda 不,我的意思是排。 CSV 文件的第一行包含变量名称,即列的名称。但是,如果需要,您可以在使用 read.csv 读取数据帧后转置数据帧。照原样,CSV 文件中有 11 行,第一行用于变量名称,因此有 10 行数据和 3468 列。您究竟想要什么
    • @MKHuda 另请注意,虽然变量名(即列名)可能是整数(的字符串表示形式),但默认情况下 read.csv 会添加一个 X,因为操作这些变量名不实用(你必须在任何地方使用反引号)。
    • @Jean_Claude 我希望输出是一个数据框,其中行是(10 行)0、1、...、9,列名是 0、1、...、3467 看起来像上面链接下拉框中的图片,但将条目更改为“是”或“否”。当我独立应用代码时,我得到了正确的输出,但是当我在我制作的 R 函数中应用它时,它不起作用
    【解决方案2】:

    在第二种情况下,应该在更新之前创建逻辑矩阵,即

    i1 <- myresult>0.0005
    

    一旦我们更新为“YES”,它的类型就会更改为character,因此当我们第二次更新时,它就不起作用了。此外,最好不要两次执行相同的步骤,而是执行一次,存储为对象并继续使用它,即在第二种情况下,我们只需要否定 (!) 以便 TRUE -&gt; FALSE 和 @987654325 @

    myresult[i1] <- "YES"
    myresult[!i1] <- "NO"
    

    ifelse 的第一种情况下,问题在于ifelse 作为“测试”应用于逻辑“矩阵”,它在剥离dim 属性的同时返回vector。为了保留dim的属性,我们可以在赋值时使用[]

    mydata[] <- ifelse(mydata > 0.005, "YES", "NO")
    

    【讨论】:

    • 我明白了。是的,我明白了。我应用了它并且它有效。
    • 你知道为什么当我在 r 函数中应用这段代码时,我的输出是完全错误的吗?它看起来像我附上的第一张照片。
    • @MKHuda。这是因为当您将向量输出分配给同一对象时,不会维护结构。它由[] 维护
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多