我有一个大数据集df$ColumnName
(354903行),其中有两列名为df$ColumnName.1
和head(df)
CompleteName CompleteName.1
1 Lefebvre Arnaud Lefebvre Schuhl Anne
1.1 Lefebvre Arnaud Abe Lyu
1.2 Lefebvre Arnaud Abe Lyu
1.3 Lefebvre Arnaud Louvet Nicolas
1.4 Lefebvre Arnaud Muller Jean Michel
1.5 Lefebvre Arnaud De Dinechin Florent
> match(df$CompleteName[1], df$CompleteName.1[1], nomatch = 0)
[1] 0
> match(df$CompleteName[1:10], df$CompleteName.1[1:10], nomatch = 0)
[1] 0 0 0 0 0 0 0 0 0 0
我正在尝试创建标签以查看天气名称是否相同。 当我尝试一个小子集时,它会工作[1如果它们是相同的,则为0如果不是]:
> match(df$CompleteName, df$CompleteName.1, nomatch = 0)
[1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
[23] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
[45] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101
但是一旦我抛出完整的列,它就会给我完全不同的值,这对我来说似乎是无稽之谈:
sapply
我应该使用 sapply(df, function(x) match(x$CompleteName, x$CompleteName.1, nomatch = 0))
吗?我没想出来,我试着写了一个错误:
{{1}}
请帮助!!!
答案 0 :(得分:5)
从比赛的手册页
'match'返回(第一个)匹配位置的向量 它是第二个论点。
所以你的数据似乎表明" Lefebvre Arnaud"的第一场比赛。 (第一个参数中的第一个位置)位于第101行。我相信你打算做的是一个简单的比较,因此它只是等于运算符==
。
一些示例数据:
> a <- rep ("Lefebvre Arnaud", 6)
> b <- c("Abe Lyu", "Abe Lyu", "Lefebvre Arnaud", rep("De Dinechin Florent", 3))
> x <- data.frame(a,b, stringsAsFactors=F)
> x
a b
1 Lefebvre Arnaud Abe Lyu
2 Lefebvre Arnaud Abe Lyu
3 Lefebvre Arnaud Lefebvre Arnaud
4 Lefebvre Arnaud De Dinechin Florent
5 Lefebvre Arnaud De Dinechin Florent
6 Lefebvre Arnaud De Dinechin Florent
> x$a == x$b
[1] FALSE FALSE TRUE FALSE FALSE FALSE
编辑:此外,您需要确保将苹果与苹果进行比较,因此请仔细检查列的数据类型。使用str(df)
查看列是字符串还是因子。您可以使用&#34; stringsAsFactors = FALSE&#34;来构造矩阵,或者从因子转换为字符。有几种方法可以做到这一点,请点击此处:Convert data.frame columns from factors to characters
答案 1 :(得分:4)
正如其他人所指出的那样,match
并不在这里。您想要的是平等,您可以通过==
进行测试,从而获得TRUE/FALSE
。然后使用as.numeric
将为您提供所需的1/0
或使用which
将为您提供索引。
但您可能仍然遇到因素问题!
# making up some similar data( adapted from earlier answer)
a <- rep ("Lefebvre Arnaud", 6)
b <- c("Abe Lyu", "Abe Lyu", "Lefebvre Arnaud", rep("De Dinechin Florent", 3))
df <- data.frame(CompleteName = a, CompleteName.1 = b)
which(df$CompleteName == df$CompleteName1)
#integer(0)
#Warning message:
#In is.na(e2) : is.na() applied to non-(list or vector) of type 'NULL'
str(df)
# 'data.frame': 6 obs. of 2 variables:
# $ CompleteName : Factor w/ 1 level "Lefebvre Arnaud": 1 1 1 1 1 1
# $ CompleteName.1: Factor w/ 3 levels "Abe Lyu","De Dinechin Florent",..: 1 1 3 2 2 2
stringsAsFactors
上面,data.frame没有用stringsAsFactors=FALSE
构造并导致错误。不幸的是,开箱即用R
会强制字符串加载csv
或创建data.frame
的因素。通过明确指定stringsAsFactors=FALSE
df <- data.frame(CompleteName = a, CompleteName.1 = b, stringsAsFactors = FALSE)
df[which(df$CompleteName == df$CompleteName.1), ]
## CompleteName CompleteName.1
## 3 Lefebvre Arnaud Lefebvre Arnaud
要避免将来出现此问题,请在R会话开始时运行options(stringsAsFactors = FALSE)
(或将其放在.R
脚本的顶部)。这里有更多讨论:
答案 2 :(得分:3)
这是一个使用data.table
与data.frame
解决方案进行性能比较的解决方案,基于与您的情况相同的记录数量。
col1 = sample(x = letters, size = 354903, replace = TRUE)
col2 = sample(x = letters, size = 354903, replace = TRUE)
library(data.table)
dt = data.table(col1 = col1, col2 = col2)
df = data.frame(col1 = col1, col2 = col2)
# comparing the 2 columns
system.time(dt$col1==dt$col2)
system.time(df$col1==df$col2)
# storing the comparison in the table/frame itself
system.time(dt[, col3:= (col1==col2)])
system.time({df$col3 = (df$col1 == df$col2)})
data.table
方法为我的机器提供了显着的加速:从0.020秒到0.008秒。
亲自尝试看看。我知道这对于如此少量的行并不是很重要,但是乘以1000并且你会看到一个主要的区别!