我有两个数据帧df1(4x4)和df2(4x1)。在每个变量中,第一个变量(即Original_items和Reordered)是字符串。在df1中,V2:V4是数字。您可以看到在df1和df2中,第一个变量中的数据以不同的顺序排列。我需要执行以下操作。
采用df2“重新排序”变量的第一个元素(即享受假期),然后搜索df1“ Original_items”变量的元素以找到完全匹配的元素。
找到匹配项后,我需要获取与df1'Original_items'中匹配的元素相关联的整行数据(即“享受假期。”,4,1,3),并将其附加到df2“重新排序”变量(即“享受假期”)。我需要在名为df_desired的新数据帧中输出此数据,该数据帧应为:“享受假期”,“享受假期”,4、1、3。请参见下面的示例图。
完成此操作后,我想对df2“重新排序”变量的每个元素重复此过程,因此最终结果看起来像下面的df_desired表。
问题的背景。我大约有2,000个项目,每个项目都有1,000个数据点。由于我需要以预定义的方式匹配项目并追加数据,因此我试图考虑一种有效的解决方案。
编辑 有人建议我可以简单地重命名“原始变量”中的项目。虽然这是事实,但对超过2,000个项目的数据帧进行操作很不方便。
此外,有人提到这个问题可能仅与合并有关。我认为这里仅需要在df1和df2中被标识为相同的元素进行合并。因此,存在两个关键问题:1)在这种特殊情况下如何匹配字符串变量? 2)如何有条件地合并/附加行,即是否已匹配。谢谢您的投入,谢谢您的帮助
我将提及到目前为止我尝试过并发现的内容。我意识到
df1[,1] == df2 [,1] # gives me true or false if rows in column 1 are the
same in both data frames. I tried to set up a double loop, but unsuccessfully
for (i in 1:nrow(df1)) {
for (j in 1:nrow(df2)){
if (i==j){
c <- merge(a,b)
} else
print("no result")
}
}
我觉得在循环中,我无法指定仅使用df1中单个变量“ Original_item”中的行值
# df1 (4x4 matrix)
Original_items V2 V3 V4
Love birds. 1 5 3
Eat a lot of food. 2 5 5
Love birthdays. 2 2 4
Enjoy holidays. 4 1 3
# df2 (4x1 matrix)
Reordered
Enjoy holidays.
Eat a lot of food.
Love birds.
Love birthdays.
# df_desired (4x5 matrix)
Reordered Original_items V2 V3 V4
Enjoy holidays. Enjoy holidays. 4 1 3
Eat a lot of food. Eat a lot of food. 2 5 5
Love birds. Love birds. 1 5 3
Love birthdays. Love birthdays. 2 2 4
答案 0 :(得分:1)
如果我正确理解,您首先想对df1$original_items
进行排序,使其顺序与df2
重排序相同,然后将相同的排序模式应用于其余df1
变量。
首先按照您希望df1
的那些行结束的顺序来获取df1
的索引向量。
#initialize an object to capture the above output
indices <- NULL
for (i in 1:nrow(df1)) {
indices[i] <- which(df1$Original_items == df2$Reordered[i]))
}
然后,仅使用此索引列表对df1
的所有行进行重新排序并创建新的df。
df_desired <- cbind(df2$Reordered, df1[indices, ])