根据另一个单元格的内容将R数据帧中的数据从一个单元格复制到另一个单元格

时间:2018-04-25 15:45:23

标签: r dataframe copy-paste

这里有一些示例代码可以帮助每个人理解我在这里要做的事情:

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

我要做的是将“Answer”行与其上方行中的相应数据相关联,然后删除那些“Answer”行。因此,我需要将“Answer”行上的“Correct”列的内容移动到前一行的同一列中的单元格。我对此问题的直觉最初是尝试索引这些答案行并以这种方式搜索数据框,但我不确定如何实现命令从这些特定单元格中取出数据并将其移动到其他特定单元格。非常感谢对此问题的任何见解,谢谢!

2 个答案:

答案 0 :(得分:1)

使用data.table包,您可以浏览每个ID,选择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'FALSE的行,将这些行用于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]

答案 1 :(得分:1)

@ Renu的方法很棒,但我更喜欢dplyr / tidyverse

df %>%
  group_by(ID) %>%
  summarise(
    PicName = first(PicName),
    Rating = first(Rating),
    Correct = nth(Correct, 2))

返回:

# A tibble: 2 x 4
     ID PicName Rating Correct
  <int> <fct>    <int>   <int>
1     1 flower       4       1
2     2 cat          5       1

虽然几乎是一样的。