线性代数-R从表矩阵中提取变量映射



这里有点脑筋急转弯——我可以手工完成,但必须有一种线性代数的方法。

我使用了table函数来生成一个数据帧/矩阵,其中包含两个变量的重合计数:

>table(gfk_data$AnswerID, gfk_data$AnswerText)

          Very unlikely Unlikely Somewhat likely Very likely
  1161841             0        0               0        3029
  1161842             0        0             175           0
  1161843             0      165               0           0
  1161844           562        0               0           0
  1161845             0        0               0          31
  1161846             0        0              26           0
  1161847             0       26               0           0
  1161848            45        0               0           0

如何获取作为行名的AnswerID到作为列标题的AnswertText的映射?

也许这更容易从原始数据帧中提取?

期望的结果是:

AnswerID  AnswerText   
1161841   Very likely
1161842   Somewhat likely
1161843   Unlikely
...

到目前为止,我可以考虑使用一个循环来查找原始数据帧中每个AnswerID的AnswerText值,并将该返回的unique()插入到数据帧中。这当然行,但也许还有更优雅的东西?

您可以使用as.data.frame.table()提取前两列,其中第三列大于0:

as.data.frame.table(
    table(gfk_data$AnswerID, gfk_data$AnswerText)
    )[as.data.frame.table(table(gfk_data$AnswerID, gfk_data$AnswerText))[,3] > 0, c(1,2)]

使用@lmo的df的另一个选项是

data.frame(answerID=rownames(df),answerText=names(df)[apply(df,1,which.max)])

我发现我可以将生成的矩阵放入数据帧中,然后根据大于0的项目频率进行过滤。

count_df <- as.data.frame(table(gfk_data$AnswerID, gfk_data$AnswerText))
count_df[count_df$Freq>1,]

数据帧的前两列会给我想要的结果

      Var1            Var2 Freq
4  1161844   Very unlikely  562
8  1161848   Very unlikely   45
11 1161843        Unlikely  165
15 1161847        Unlikely   26
18 1161842 Somewhat likely  175
22 1161846 Somewhat likely   26
25 1161841     Very likely 3029
29 1161845     Very likely   31

这里有一种从上面的输出中获取它的方法。构造第一列的"诀窍"是使用一个查找表,该表按每列的最大值提取正确的行名。

dfNew <- data.frame(answerID=rownames(df)[max.col(df)],
                    answerText=names(df), stringsAsFactors=F)
  answerID      answerText
1 1161844   Very_unlikely
2 1161843        Unlikely
3 1161842 Somewhat_likely
4 1161841     Very_likely
5 1161844   Very_unlikely
6 1161843        Unlikely
7 1161842 Somewhat_likely
8 1161841     Very_likely

数据帧可以使用order 重新排序

dfNew <- dfNew[order(dfNew$answerID),]
dfNew
  answerID      answerText
4  1161841     Very_likely
8  1161841     Very_likely
3  1161842 Somewhat_likely
7  1161842 Somewhat_likely
2  1161843        Unlikely
6  1161843        Unlikely
1  1161844   Very_unlikely
5  1161844   Very_unlikely

数据

df <- read.table(header=T, text="         Very_unlikely Unlikely Somewhat_likely Very_likely
1161841             0        0               0        3029
1161842             0        0             175           0
1161843             0      165               0           0
1161844           562        0               0           0
1161845             0        0               0          31
1161846             0        0              26           0
1161847             0       26               0           0
1161848            45        0               0           0")

相关内容

  • 没有找到相关文章

最新更新