我是来自SAS背景的R的初学者,试图在两张桌子上做一个基本的“案例”匹配,以获得我所拥有的旗帜并且没有找到匹配。请参阅下面我想到的SAS代码。我只需要在R中使用类似于此的东西。先谢谢。
itemUrl = obj.SelectSingleNode(".//a").Attributes["href"].Value, itemId = obj.SelectSingleNode(".//article").Attributes["data-id"].Value
答案 0 :(得分:0)
我不熟悉SAS,但我想我明白你要做什么。要查看两个表之间有多少行/列相似,可以使用%in%和length函数。
例如,初始化两个不同维度的矩阵,并给它们类似的行名和列名:
mat.a <- matrix(1, nrow=3, ncol = 2)
mat.b <- matrix(1, nrow=2, ncol = 3)
rownames(mat.a) <- c('a','b','c')
rownames(mat.b) <- c('a','d')
colnames(mat.a) <- c('g','h')
colnames(mat.b) <- c('h','i')
mat.a和mat.b现在存在不同的行名和列名。要按名称匹配行,可以使用:
row.match <- rownames(mat.a)[rownames(mat.a) %in% rownames(mat.b)]
num.row.match <- length(row.match)
请注意,row.match现在可用于索引两个矩阵。 %in%运算符返回第一个参数(在本例中为rownames(mat.a))的相同长度的逻辑,指示第一个参数的第i个元素是否在第二个参数的元素中的任何位置找到。 %in%的这种性质意味着您必须对索引的参数的排序方式保持敏感。
如果您只想量化两个矩阵之间的行数或列数相同,那么您可以将sum函数与%in%运算符一起使用:
sum(rownames(mat.a) %in% rownames(mat.b))
使用这样使用的sum函数,您不需要对如何对参数进行排序敏感,因为mat.b的行名称中mat.a的行名称数等于行名称的数量mat.a的行名称中的mat.b.也就是说,%in%的使用是可交换的。
我希望这有帮助!
答案 1 :(得分:0)
您将需要使用dataframe
个对象。这些就像SAS中的数据集。您可以使用bind
将两个dataframe
对象并排放在一起。然后,您可以根据条件选择行,并根据此设置标志。在下面的代码中,您将看到我执行了两次:一次设置1标志,一次设置0标志。
要选择所有字段匹配的行,您可以执行类似操作,但不是分配新列,而是可以将所有结果分配回您正在处理的表的名称。
以下是代码:
# make up example a and b data frames
table1 <- data.frame(list(a.first_column=c(1,2,3),a.second_column=c(4,5,6)))
table2 <- data.frame(list(b.first_column=c(1,3,6),b.second_column=c(4,5,9)))
# Combine columns (horizontally)
x <- cbind(table1, table2)
print("Combined Data Frames")
print(x)
# create matched flag (1 when the first columns match)
x$matched_flag[x$a.first_column==x$b.first_column] <- 1
x$matched_flag[!x$a.first_column==x$b.first_column] <- 0
# only select records that match both data frames
x <- x[x$a.first_column==x$b.first_column & x$a.second_column==x$b.second_column,]
print("Matched Data Frames")
print(x)
顺便说一下:既然你习惯使用SQL,你可能想在R中尝试 sqldf 包。它会让你使用你习惯的相同技术,但在R和数据中帧。