比较两列

时间:2014-07-24 19:01:07

标签: r for-loop dataframe runtime-error warnings

我是R的新手,我在Python中一直做的命令遇到了麻烦。

我有两个数据框(数据库和creditID),我想要做的是比较数据库中的一列和creditID中的一列。更具体地说,creditIDs[,1]中存在一个值但database[,5]中没有,我想删除database中的整行。 这是代码:

for (i in 1:lengthColumns){
    if (!(database$credit_id[i] %in% creditosVencidos)){
        database[i,]<-database[-i,]
  }
}

但我继续犯这个错误:

50: In `[<-.data.frame`(`*tmp*`, i, , value = structure(list( ... :
replacement element 50 has 9696 rows to replace 1 rows

有人可以解释为什么会这样吗?谢谢!

2 个答案:

答案 0 :(得分:0)

which()命令将返回满足布尔语句的行索引,就像python中的numpy.where()一样。在带有列名的数据框后使用$可以得到该列的向量...或者你可以做d [,column_number]。

在这个例子中,我创建了一个x和y列,它共享前五个值,并使用which()来分割数据帧的行数相等:

L3 <- LETTERS[1:3]
fac <- sample(L3, 10, replace = TRUE)
(d <- data.frame(x = rep(1:5, 2), y = 1:10, fac = fac))

d = d[which(d$x == d$y),]
d

  x y fac
  1 1  A
  2 2  B
  3 3  C
  4 4  B
  5 5  B

答案 1 :(得分:0)

您需要针对列名称/数字进行调整。

# Create two example data.frames
creditID <- data.frame(ID = c("896-19", "895-8", "899-1", "899-5"))
database <- data.frame(ID = c("896-19", "camel", "899-1", "goat", "899-1"))

# Method 1 
database[database$ID %in% creditID$ID, ] 

# Method 2 (subset() function)
database <- subset(database, ID %in% creditID$ID)