head(df)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1 1152652 1152652 0 0 2 -9 1 1 2 2 0 0 2 2 1 1
2 1051495 1051495 0 0 2 -9 1 1 2 2 0 0 2 2 1 1
3 1195877 1195877 0 0 2 -9 1 1 2 2 0 0 2 2 1 1
此df约为200,000行。我想比较第8列中的2个整数。我试过转换。当我使用strsplit()
时,情况变得非常混乱。
例如,如果我采用V8栏:
V8 <- as.character(df$V8)
test <- strsplit(V8, " ")
head(test)
[[1]]
[1] "2" "2"
是否有更优雅的想要这样做?我只对第8栏感兴趣。非常感谢。
答案 0 :(得分:1)
使用<p>Lorem Ipsum is simply dummy text</p>
,您可以将tidyr::separate
列分为两列(即V8
和V8a
):
V8b
然后,您可以比较这些:
library(tidyr)
df <- separate(df,V8,c("V8a","V8b"))
V1 V2 V3 V4 V5 V6 V7 V8a V8b V9 V10 V11
1 1152652 1152652 0 0 2 -9 1 1 2 2 0 0 2 2 1 1
2 1051495 1051495 0 0 2 -9 1 1 2 2 0 0 2 2 1 1
3 1195877 1195877 0 0 2 -9 1 1 2 2 0 0 2 2 1 1
数据:强>
is_eq <- df$V8a == df$V8b
##[1] TRUE TRUE TRUE
答案 1 :(得分:1)
我想留下一个想法,你可以为多个列处理这个任务,因为数据集包含几个分别包含两个数字的列。我在下面创建了一个简单的数据这里,V1和V2包含两个数字。所以我想对这些列进行数字比较。第一步是确定哪些列包含两个数字。他们之间应该有一个空间。使用此想法,您可以识别目标列。在grep()
中,我选择了第一行数据并搜索了包含空格的字符串。然后,我选择了列名(即V1和V2)。第二步是使用cSplit()
拆分目标列。拆分列后,数字变为数字,而不是字符。在第三步中,您在lapply()
中选择一对列并进行简单计算。如果两个数字相同,则减法应返回0.您可以使用它进行逻辑检查并创建一个名为check
的新列,并且仅选择列。然后,使用cbind()
创建数据表。最后,您希望使用ind
(即V1和V2)更新列名。
library(dplyr)
library(data.table)
library(splitstackshape)
mydf <- data.frame(V1 = c("1 1", "2 3", "3 3"),
V2 = c("10 11", "12 12", "13 13"),
V3 = 101:103,
stringsAsFactors = FALSE)
# V1 V2 V3
#1 1 1 10 11 101
#2 2 3 12 12 102
#3 3 3 13 13 103
# Find columns which include two numbers.
mydf[, grepl(pattern = "\\s", x = mydf[1, ])] %>%
colnames -> ind
# Prepare a data set splitting numbers in one column
cSplit(mydf, splitCols = ind, direction = "wide", sep = " ") -> temp
# Choose a pair of columns. Check if the subtraction generates 0.
# If 0, two numbers are identical. If not, they do not match.
lapply(ind, function(i){
temp[, grep(i, x = names(temp)), with = FALSE] -> foo
foo[, check := foo[, 1, with = FALSE]- foo[, 2, with = FALSE] == 0]
foo[, 3, with = FALSE] -> foo
foo
}) -> temp
# Create a data table
do.call(cbind, temp) -> out
# Update column names
setnames(out, ind)
# V1 V2
#1: TRUE FALSE
#2: FALSE TRUE
#3: TRUE TRUE