【问题标题】:Can't modify the contents of specific columns with binary values无法用二进制值修改特定列的内容
【发布时间】:2018-02-20 14:26:14
【问题描述】:

data.table DataDia 中有 10 列。

> head(DataDia[,c(7:16)])
    Type soin 01  Type soin 02 Type soin 03 Type soin 04 Type soin 05 Type soin 06 Type soin 07          Type soin 08              Type soin 09 Type soin 10
1: crme de jour                                   sérum                                        démaquillant à rincer                                       
2:                                                             masque                           démaquillant à rincer                                       
3:               crme de nuit                     sérum                    lotion                                                                          
4:                                                 sérum                    lotion  eau florale                                                             
5: crme de jour                                   sérum                                                              démaquillant sans rinage             
6:               crme de nuit        huile        sérum     

我只想应用一个通用函数 modify 包含 just only 这些列的二进制值。如果列有空单元格,那么它将被 0 替换,否则被 1 替换。 所以我写了这些代码:

DataDia[,DataDia[,c(5:10)]:=lapply(colnames(DataDia[,c(5:10)]), function(x) {if (DataDia[,x]==""){0} else {1}})]                 

但我收到此错误:

[.data.table(DataDia, , :=(DataDia[, c(7:16)]) 中的错误, lapply(colnames(DataDia[, : LHS of := 必须是符号或原子 向量(列名或位置)。

请注意,我想使用 data.table 操作。但我不知道为什么这在这里不起作用?

提前谢谢你!

【问题讨论】:

  • 什么是:=?当然不是 R(使用<-)。另外,我不明白为什么DataDia[,DataDia[,c(5:10)]。缺少],据我所知,DataDia[, 5:10] 会很好。
  • 试试lapply(DataDia[, 5:10], function(x) as.integer(x == ""))
  • @RuiBarradas,我需要替换列以便使用:=。事实上,我不想每次都添加其他列并删除原始列。我也认为你的建议,但它不起作用!
  • 您可以发布示例数据吗?请使用dput(DataDia[, 5:10]) 的输出编辑问题。或者,如果 dput(DataDia[1:20, 5:10]) 的输出太大。

标签: r data.table


【解决方案1】:

首先,一个词汇点:带有“”的单元格不是空单元格,而是包含空字符串的单元格本身就是一个值。 “空单元格”是指缺失值,在表格中显示为 NA。

通常,在 R 中加载数据时,缺失的数据应该已经被识别出来(例如,通过 read.table 函数中的 na.strings = 参数)。如果你告诉我你是如何加载数据的,我可以帮助你如何做到这一点。

至于你的代码,我会选择更简单的:

DataDia[,5:10] <- data.table(0+ !(DataDia[,5:10] == ""))

注意:这里使用0 + 部分来获取数字值 0 代表 FALSE 和 1 代表 TRUE。感叹号用于测试所写条件的相反(我们希望它返回FALSE或当单元格为“”时返回0)。您需要 data.table 函数,因为矩阵似乎无法正确强制转换为 data.table

这是处理示例数据集的代码:

> DataDia
    Produit1 Produit2 Produit3 Produit4
 1:                 b        c        d
 2:        a        b        c         
 3:        a                 c        d
 4:        a        b                 d
 5:        a                 c        d
 6:        a        b        c        d
 7:                 b        c        d
 8:        a        b        c        d
 9:        a        b                 d
10:        a        b        c        d

> DataDia[,2:3] <- data.table(0+ !(DataDia[,2:3] == ""))
> DataDia
    Produit1 Produit2 Produit3 Produit4
 1:                 1        1        d
 2:        a        1        1         
 3:        a        0        1        d
 4:        a        1        0        d
 5:        a        0        1        d
 6:        a        1        1        d
 7:                 1        1        d
 8:        a        1        1        d
 9:        a        1        0        d
10:        a        1        1        d

【讨论】:

  • 感谢您的发言,首先按照您的建议我将数据导入修改为DataDia=fread("Diagnostic.csv",na.strings = c("","NA")),然后按照您的建议进行DataDia[,7:16] &lt;- as.numeric(!(DataDia[,7:16] %in% "NA")),但是有Big警告信息。在您的信息中,我在导入数据时也有很多警告信息!
  • 如果你有 NA 而不是 "",这些不再是字符串,所以 %in% "NA" 将不起作用。在这种情况下,请使用DataDia[,7:16] &lt;- as.numeric(!is.na(DataDia[,7:16]))
  • 谢谢它的工作,但我有警告信息! Messages d'avis : 1: In [&lt;-.data.table(*tmp*, , 7:16, value = c(1, 0, 0, ... : 提供 81100 项分配给列 ' 的 8110 项输入 soin 01'(72990 未使用)
  • 抱歉,我对标准data.frameobjects 的行为比data.tableobjects 更熟悉。这是我在 data.table 上测试的代码:DataDia[,7:16] &lt;- data.table(0+ !is.na(DataDia[,7:16]))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 1970-01-01
  • 2010-10-12
  • 2011-07-08
  • 1970-01-01
相关资源
最近更新 更多