R 如何删除矩阵中未使用的行和列
我不熟悉R编程 我有两个列表,一个列表包含用户名。 另一个列表包含每个用户访问的页面 用户:R 如何删除矩阵中未使用的行和列,r,matrix,R,Matrix,我不熟悉R编程 我有两个列表,一个列表包含用户名。 另一个列表包含每个用户访问的页面 用户: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,
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
page2 page4 page1
这将实现以下目的:
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 = '')
k这将实现以下目的:
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 = '')
k将记录作为输入,然后
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
将记录作为输入,然后
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
你能把你的两张单子给我举个例子吗?如果您将两个列表绑定到一个数据框中,那么一个简单的聚合(aggregate(pages~user,df,toString)
)应该执行此任务。所有用户访问相同数量的页面吗?否则,矩阵将无法工作,因为每个用户需要不同的列数。@herbaman每个用户查看的页面数是不同的。现在我明白了我的错误,矩阵不能被使用,因为它应该是一些固定的行x列。你能建议其他方法来实现我的预期解决方案吗?我一直在研究这个解决方案,但我同意@herbaman的观点,矩阵有固定的列数,它会影响最终的输出。您正在打印NA,因为矩阵的单元格初始化时没有值。提供最终解决方案的可能方法是:a)使用空字符串初始化矩阵,或在out函数中设置na.print标志,以将na值可视化为空字符串,或c)a)或b)的组合,并将矩阵行修剪为单个用户查看的最大页数您可以使用列表列表,aggregate()。我支持@Sotos,你应该提供一个可复制的数据示例。你能给出两个列表的一个例子吗?如果您将两个列表绑定到一个数据框中,那么一个简单的聚合(aggregate(pages~user,df,toString)
)应该执行此任务。所有用户访问相同数量的页面吗?否则,矩阵将无法工作,因为每个用户需要不同的列数。@herbaman每个用户查看的页面数是不同的。现在我明白了我的错误,矩阵不能被使用,因为它应该是一些固定的行x列。你能建议其他方法来实现我的预期解决方案吗?我一直在研究这个解决方案,但我同意@herbaman的观点,矩阵有固定的列数,它会影响最终的输出。您正在打印NA,因为矩阵的单元格初始化时没有值。提供最终解决方案的可能方法是:a)使用空字符串初始化矩阵,或在out函数中设置na.print标志,以将na值可视化为空字符串,或c)a)或b)的组合,并将矩阵行修剪为单个用户查看的最大页数您可以使用列表列表,aggregate()。我支持@Sotos,您应该提供一个可复制的数据示例。
matrix(paste0('page', m1[,-1]), nrow = nrow(m1))
# [,1] [,2] [,3]
#[1,] "page1" "page3" "page4"
#[2,] "page2" "page4" "page1"