我是R Programming的新手。
我有两个列表,一个列表包含用户名。 另一个列表包含每个用户访问的页面
用户:AAA BBB CCC DDD
记录:
page 1 AAA
page 2 BBB
page 3 AAA
page 4 BBB
page 1 BBB
page 4 AAA
我需要收集每个用户访问的所有页面
需要输出:
Pages visited by AAA page1,page 3, page 4
Pages visited by BBB page 2, page4, page 1
我试图将每个用户访问的页面存储在矩阵中 例如,矩阵的第1行中的列将包含用户1查看的页面,依此类推 请看下面的代码:
k <- 0
out <- matrix(NA, nrow=100, ncol=50) #my final output matrix
for (i in users)
{
k <- k+1
p <- 0
for (j in records)
{
x<-(strsplit(j, "\t"))
if(x[[1]][2]== i) #gather all pages visited by a same user
{
p <- p+1
out[k,p]=c(x[[1]][1])
}
}
x <- 0
#here i need to remove unused columns in row k
}
out <- out[1:(k),] #remove unused rows in a matrix
print (out)
我得到的输出
page1 page3 page4 NA NA NA .... NA
page2 page4 page1 NA NA NA .... NA
需要最终矩阵:
page1 page3 page4
page2 page4 page1
答案 0 :(得分:0)
这样可以解决问题:
k <- 0
out <- matrix(NA, nrow=100, ncol=50) #my final output matrix
#Initialize max count of rows
maxr<-0
for (i in users)
{
k <- k+1
p <- 0
for (j in records)
{
x<-(strsplit(j, "\t"))
if(x[[1]][2] == i) #gather all pages visited by a same user
{
p <- p+1
out[k,p] =c(x[[1]][1])
#If we have a greater p, p will be the new maxr
if(p > maxr)
{
maxr <- p
}
}
}
x <- 0
#here i need to remove unused columns in row k
}
#Trim matrix by rows and cols
out <- out[1:(k),1:(maxr)] #remove unused rows in a matrix
#Replace NA with empty string
print (out, na.print = '')
希望这个解决方案有所帮助。
此致
答案 1 :(得分:0)
以records
作为输入,然后
df <- as.data.frame(do.call(rbind, strsplit(gsub('\t', ' ', records), ' ')),
stringsAsFactors = FALSE)
aggregate(V2 ~ V3, df, toString)
# V3 V2
#1 AAA 1, 3, 4
#2 BBB 2, 4, 1
如果你想要一个矩阵,那么,
m1 <- aggregate(V2 ~ V3, df, matrix)
m1[,-1]
# [,1] [,2] [,3]
#[1,] "1" "3" "4"
#[2,] "2" "4" "1"
或者如果你真的想在数字前加上'page',
matrix(paste0('page', m1[,-1]), nrow = nrow(m1))
# [,1] [,2] [,3]
#[1,] "page1" "page3" "page4"
#[2,] "page2" "page4" "page1"