r - 如果 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)
解决方案
替换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 = "")]
这将删除导致问题的字节——您希望保留的潜在字符以完全匹配条目。我认为完全修复它可能超出了这个问题的范围。
推荐阅读
- bash - 后台进程与子shell的 SIGINT 传播
- signtool - Signtool SignerSign() 错误 (-1073700864/0xc000a000)
- c# - 我可以将 Entity Framework Core 与 ASP.NET MVC(非核心)一起使用吗?
- python - Python:在 torch.utils.data.DataLoader 对象上调用 iter 时出现 BrokenPipeError
- r - R - 提取时间以及作为字符串一部分的时区
- python - matplotlib xkcd and black figure background
- python-3.x - ServerSelectionTimeoutError: basicdatabase-w4eg3.mongodb.net:27017: [Errno 11001] getaddrinfo 失败
- php - 无论如何都不显示注销
- reactjs - 在 React 项目中包含一个 css 文件
- python - 从一系列列表中创建一个 Pandas DataFrame