我有以下问题,我不知道从哪里开始R: 我有两列具有相同的信息,但一列包含一些其他信息。我希望两列完全相同。这是一个例子:
1 1
1 1
2 1
2 2
3 2
3 2
4 2
4 3
5 3
5 3
4
4
4
5
5
5
5
5
因此,必须删除第二列中的某些数字,以便两列的长度相等,并且每行中的数字相同。我想有可能构造一个循环并告诉R删除第二列中的数字,直到column1 = column2
。
但我不知道从哪里开始。是否有可能R自动读取两列,如果两行不匹配则删除?
答案 0 :(得分:3)
以面值表示您的问题,这将仅返回第1列==第2列的行,并且还删除带NA的行。如果这不是您期望的输出,请进一步澄清您的问题,最好使用reproducible示例。
> dat <- read.table(text = "1 1
+ 1 1
+ 2 1
+ 2 2
+ 3 2
+ 3 2
+ 4 2
+ 4 3
+ 5 3
+ 5 3
+ NA 4
+ NA 4
+ NA 4
+ NA 5
+ NA 5
+ NA 5
+ NA 5
+ NA 5", header = FALSE)
> dat[dat$V1 == dat$V2 & complete.cases(dat),]
V1 V2
1 1 1
2 1 1
4 2 2
答案 1 :(得分:0)
首先,让我们制作一些说明问题的R对象:
a <- c(1,1,2,2,3,3,4,4,5,5)
b <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,5)
从问题来看,听起来你将它们放在同一个对象中:
c <- cbind(a,b)
Warning message:
In cbind(a, b) :
number of rows of result is not a multiple of vector length (arg 1)
但这实际上会将length(b) - length(a)
的第一个a
元素添加到结尾,以便它与b
一样长。
您可以先填写a
的缺失值:
a2 <- append(a, rep(NA, 6)
现在你可以把它们绑在一起了:
c <- cbind(a2, b)
但现在听起来你想从b中删除与a不匹配的元素。你提出了一个for循环。但这会变得混乱,并会很快证明手头的任务定义不明确。 while
可能更合适,但同样,很快就会变得明显,正如@ user1407656在评论中提到的那样,只需将a
的两列绑定在一起就可以获得所需的结果:
d <- cbind(a,a)