比较R中单列内的字符

时间:2016-12-15 02:59:18

标签: r

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栏感兴趣。非常感谢。

2 个答案:

答案 0 :(得分:1)

使用<p>Lorem Ipsum is simply dummy text</p> ,您可以将tidyr::separate列分为两列(即V8V8a):

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