我对 R 相当陌生,我正在尝试比较两个字符列。
我有一个包含两列和 5000 多行物种名称的文件。柱子的长度不同,并且许多物种名称重复。
第 1 列(蜜蜂)是旧的物种列表。第 2 列(科学名称)是更新的物种列表。我需要测量每个物种的大小,因此我希望更新的列表包含两列中的每个物种一次。
我需要的不仅仅是“等于”或“不等于”;我需要看看与其他列相比,每列中缺少哪些物种。
本质上,我需要每一列都是唯一物种(不重复)的列表,并查看其中一列是否有另一列没有的物种(我希望我能清楚地阐明这一点)。
我最初使用 unique() 函数来获取不重复的名称列表。然后,我打算比较每列的列表,但输出的格式不是可以轻松手动传输到 .csv 的格式。 (它列出了 1“物种名称”2“物种名称”等,我需要连续每个物种,没有数字或引号)。
我发现的大多数代码仅适用于数值数据。
此后我尝试了以下方法:
df %>% mutate(comparison = if_else( as.character(df$Bees) == as.character(df$scientificName), "equal", "different"))
我收到错误:“比较”大小必须为 5386 或 1,而不是 0。
-----
df$Match <- as.character(df$Bees) == as.character(df$scientificName)
这里的错误是:
Error in $<-: ! Assigned data as.character(df$Bees) == as.character(df$scientificName)must be compatible with existing data. ✖ Existing data has 5386 rows. ✖ Assigned data has 0 rows. ℹ Only vectors of size 1 are recycled. Caused by error invectbl_recycle_rhs_rows(): ! Can't recycle input of size 0 to size 5386.
-----
library(vecsets) eg_data <- data.frame( col1 = df$Bee, col2 = df$scientificName, stringsAsFactors=FALSE) eg_data$name1_diff1_2 <- mapply(vsetdiff, strsplit(eg_data$col1, split = ""), strsplit(eg_data$col2, split = "")) eg_data$name2_diff2_1 <- mapply(vsetdiff, strsplit(eg_data$col2, split = ""), strsplit(eg_data$col1, split = ""))
此输出的每个字符都是它自己的字符串。
-----
setdiff(df$Bee, df$scientificName)
这个输出是我得到的最接近的,它确实显示了不同的物种,但它没有告诉我哪里差异在哪里(即哪一列有它,哪一列没有)
-----
anti_join(df$Bee, df$scientificName, by = "text")
错误消息是
Error in UseMethod("anti_join") : no applicable method for 'anti_join' applied to an object of class "character"
命令
df$Match <- as.character(df$Bees) == as.character(df$scientificName)
要求R对两个值进行比较。 ==
运算符的结果始终是长度为 1 的逻辑向量,但看起来调用的输出长度为 0(可能为 NULL?)。所以它不能在 nrow(df)
上回收向量。重新运行为:
x <- as.character(df$Bees) == as.character(df$scientificName)
如果有错误请告诉我们。