这里有一些示例代码可以帮助每个人理解我在这里要做的事情:
ID PicName Rating Correct
1 flower 4
1 Answer 1
2 cat 5
2 Answer 1
我要做的是将“Answer”行与其上方行中的相应数据相关联,然后删除那些“Answer”行。因此,我需要将“Answer”行上的“Correct”列的内容移动到前一行的同一列中的单元格。我对此问题的直觉最初是尝试索引这些答案行并以这种方式搜索数据框,但我不确定如何实现命令从这些特定单元格中取出数据并将其移动到其他特定单元格。非常感谢对此问题的任何见解,谢谢!
答案 0 :(得分:1)
使用data.table
包,您可以浏览每个ID
,选择PicName
和Rating
的第一个值,以及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
的行,将这些行用于PicName
和Rating
列,然后将其他行用于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
虽然几乎是一样的。