首页 > 解决方案 > 如果 column value == "character(0)" 从另一列取值

问题描述

在以下数据中:

library(stringr)
library(purrr)
entry <- c("P17-Nationalist Revolutionary Movement-Free Bolivia Movement (Movimiento Nacionalista Revolucionario [MNR] - Movimiento Bolivia Libre [MBL] [MNR-MBL])",
           "P18-Socialist Party (Partido Socialista [PS])",
           "P19-Liberty and Justice (Libertad y Justicia [LJ])",
           "")
something <- c(1,2,3,4)
x <- str_match_all(entry, "(?<=\\[).+?(?=\\])") %>% map(drop)
Election_Parties <- tibble::tibble(x, something, entry)

我想character(0)用来自不同列的值替换该值,如下所示:

setDT(Election_Parties)[identical(x, character(0)) ,x := entry]

然而,这给了我错误:

Error in `[.data.table`(setDT(Election_Parties), identical(Election_Parties[,  : 
  LHS of := must be a symbol, or an atomic vector (column names or positions).

我究竟做错了什么?

期望的输出:

library(stringr)
library(purrr)
entry <- c("P17-Nationalist Revolutionary Movement-Free Bolivia Movement (Movimiento Nacionalista Revolucionario [MNR] - Movimiento Bolivia Libre [MBL] [MNR-MBL])",
           "P18-Socialist Party (Partido Socialista [PS])",
           "P19-Liberty and Justice (Libertad y Justicia [LJ])",
           "4")
something <- c(1,2,3,4)
x <- str_match_all(entry, "(?<=\\[).+?(?=\\])") %>% map(drop)
Election_Parties <- tibble::tibble(x, something, entry)

标签: rdata.table

解决方案


替换Election_Parties[,1]为 x,Election_Parties[,3]以 entry 作为开始。在 data.table 中,您应该通过它们的(不带引号的)名称来引用列,而不是通过引用表和列索引。data.table 的介绍在这里。其次,identical()不是矢量化函数,这意味着您不能在 i-slot 中使用它。例如,

identical(c(1, 1), c(1, 2))
# FALSE

向量化的相等比较应该发生在==. 如果我们查看?"==",我们会看到以下内容:

x 和 y 中的至少一个必须是原子向量,但如果另一个是列表,R 会尝试将其强制转换为原子向量的类型:如果列表由长度为 1 的元素组成,这将成功强制转换为正确的类型。

因此,正如您尝试的那样,我们无法在两个列表之间进行相等比较。在我看来,我在想也许x == list(character(0L))会起作用,但上面的引用表明它不会。

您真正感兴趣的是“列表是否具有正长度”。我们可以检查每一行x这样的。


library(stringr)
library(purrr)
entry <- c("P17-Nationalist Revolutionary Movement-Free Bolivia Movement (Movimiento Nacionalista Revolucionario [MNR] - Movimiento Bolivia Libre [MBL] [MNR-MBL])",
           "P18-Socialist Party (Partido Socialista [PS])",
           "P19-Liberty and Justice (Libertad y Justicia [LJ])",
           "")
something <- c(1,2,3,4)
x <- str_match_all(entry, "(?<=\\[).+?(?=\\])") %>% map(drop)
Election_Parties <- tibble::tibble(x, something, entry)
library(data.table)
#> 
#> Attaching package: 'data.table'
#> The following object is masked from 'package:purrr':
#> 
#>     transpose

Election_Parties[[1]]
#> [[1]]
#> [1] "MNR"     "MBL"     "MNR-MBL"
#> 
#> [[2]]
#> [1] "PS"
#> 
#> [[3]]
#> [1] "LJ"
#> 
#> [[4]]
#> character(0)

setDT(Election_Parties)
# Check lengths of x -- we want to modify zero-length pieces.

Election_Parties[,lengths(x)]
#> [1] 3 1 1 0
Election_Parties[lengths(x) == 0, x := entry]
Election_Parties[[1]]
#> [[1]]
#> [1] "MNR"     "MBL"     "MNR-MBL"
#> 
#> [[2]]
#> [1] "PS"
#> 
#> [[3]]
#> [1] "LJ"
#> 
#> [[4]]
#> [1] ""

编辑:崩溃是由编码问题引起的。我通过将最后一行更改为

dt[lengths(x) == 0, x := iconv(entry, sub = "")]

这将删除导致问题的字节——您希望保留的潜在字符以完全匹配条目。我认为完全修复它可能超出了这个问题的范围。


推荐阅读