首页 > 解决方案 > 根据另一个单元格的内容将 R 数据框中的数据从一个单元格复制到另一个单元格

问题描述

这是一些示例代码,可以帮助大家理解我在这里尝试做的事情:

ID  PicName  Rating  Correct
1   flower   4       
1   Answer           1
2   cat      5       
2   Answer           1

我要做的是将“答案”行与它们上方行中的相应数据链接起来,然后删除那些“答案”行。也就是说,我需要将“答案”行上的“正确”列的内容移动到上一行的同一列中的单元格。我对这个问题的直觉最初是尝试索引这些答案行并以这种方式搜索数据框,但我不确定如何实施命令将数据从这些特定单元格中取出并将其移动到其他特定单元格。任何对此问题的见解将不胜感激,谢谢!

标签: rdataframecopy-paste

解决方案


使用data.table包你可以遍历每一个ID,选择 and 的第一个值PicNameRating的第二个值Correct

library(data.table)
setDT(df) # give df class "data.table"
df[, .( PicName = PicName[1] 
      , Rating  = Rating[1]
      , Correct = Correct[2])
   , by = ID]

退货

   ID PicName Rating Correct
1:  1  flower      4       1
2:  2     cat      5       1

另一种选择是merge与其他人一起回答行(给出相同的结果)

setkey(df, ID)
merge(df[PicName != 'Answer', -'Correct']
      , df[PicName == 'Answer', .(ID, Correct)])

使用的数据:

df <- fread( 
"ID  PicName  Rating  Correct
1   flower   4       NA
1   Answer   NA        1
2   cat      5       NA
2   Answer  NA         1")

====================

如果ID每组有一对以上,则可以使用以下代码。这会挑选出PicName == 'Answer'isFALSE的行,将这些行用于PicNameRating列,然后将其他行用于该Correct列。

library(data.table)
library(magrittr)
setDT(df) # give df class "data.table"

df[, (PicName == 'Answer') 
      %>% {.(PicName  = PicName[!.]
            , Rating  = Rating[!.]
            , Correct = Correct[.])}
   , by = ID]

推荐阅读