【问题标题】:If value is duplicated in one column, how can I extract some values of another column into a new one?如果值在一列中重复,我如何将另一列的某些值提取到新列中?
【发布时间】:2020-06-29 12:52:48
【问题描述】:

为糟糕的标题措辞道歉。我有一些看起来像这样的数据(按 id 分组),其中“问题”列包含许多重复:

structure(list(study_id = c("02ipnnqgeovkrxz", "02ipnnqgeovkrxz", 
"02ipnnqgeovkrxz", "02ipnnqgeovkrxz", "02ipnnqgeovkrxz", "02ipnnqgeovkrxz", 
"0bsilzm5iabdnoj", "0bsilzm5iabdnoj", "0bsilzm5iabdnoj", "0bsilzm5iabdnoj", 
"0bsilzm5iabdnoj", "0bsilzm5iabdnoj", "1171bwmljjct6me", "1171bwmljjct6me", 
"1171bwmljjct6me", "1171bwmljjct6me", "1171bwmljjct6me", "1171bwmljjct6me"
), question = c("37tlJa09k7zwKFL ", "37tlJa09k7zwKFL", "3WTpbAzIQmbnlpb ", 
"3WTpbAzIQmbnlpb", "3eEVJgaAP6c9FPL ", "3eEVJgaAP6c9FPL", "7QhOyTdA1MjKmX3 ", 
"7QhOyTdA1MjKmX3", "8eMvvNHEh1CAqk5 ", "8eMvvNHEh1CAqk5", "e3u9ZmoNISb0vfn ", 
"e3u9ZmoNISb0vfn", "3IDmpN1FZDQqhcF ", "3IDmpN1FZDQqhcF", "3WRNXeyBSwuXvh3 ", 
"3WRNXeyBSwuXvh3", "6QnjC0CHjV1kmvX ", "6QnjC0CHjV1kmvX"), response = c("0.839", 
"word", "0.739", "word", "1.353", "picture", "1.418", "word", 
"1.563", "word", "6.377", "word", "1.795", "picture", "1.876", 
"picture", "0.96", "picture")), row.names = c(NA, -18L), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), groups = structure(list(study_id = c("02ipnnqgeovkrxz", 
"02ipnnqgeovkrxz", "02ipnnqgeovkrxz", "02ipnnqgeovkrxz", "02ipnnqgeovkrxz", 
"02ipnnqgeovkrxz", "0bsilzm5iabdnoj", "0bsilzm5iabdnoj", "0bsilzm5iabdnoj", 
"0bsilzm5iabdnoj", "0bsilzm5iabdnoj", "0bsilzm5iabdnoj", "1171bwmljjct6me", 
"1171bwmljjct6me", "1171bwmljjct6me", "1171bwmljjct6me", "1171bwmljjct6me", 
"1171bwmljjct6me"), question = c("37tlJa09k7zwKFL", "37tlJa09k7zwKFL ", 
"3eEVJgaAP6c9FPL", "3eEVJgaAP6c9FPL ", "3WTpbAzIQmbnlpb", "3WTpbAzIQmbnlpb ", 
"7QhOyTdA1MjKmX3", "7QhOyTdA1MjKmX3 ", "8eMvvNHEh1CAqk5", "8eMvvNHEh1CAqk5 ", 
"e3u9ZmoNISb0vfn", "e3u9ZmoNISb0vfn ", "3IDmpN1FZDQqhcF", "3IDmpN1FZDQqhcF ", 
"3WRNXeyBSwuXvh3", "3WRNXeyBSwuXvh3 ", "6QnjC0CHjV1kmvX", "6QnjC0CHjV1kmvX "
), .rows = list(2L, 1L, 6L, 5L, 4L, 3L, 8L, 7L, 10L, 9L, 12L, 
    11L, 14L, 13L, 16L, 15L, 18L, 17L)), row.names = c(NA, -18L
), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))

我正在尝试重新格式化数据,以便 - 在每个分组的 id 中 - “问题”列的每一行都是唯一的。对同一问题做出的多个回答被分成另一列:

“问题”列代表参与者看到的唯一项目,不应在 id 内重复(因为受试者只看到每个项目一次)。响应列代表他们对该项目(图片/单词)的响应 - 但现在他们的反应时间也集中在此列中。我基本上是在寻找反应时间并将它们放在一个新列中(仍然与适当的 id 和问题相对应)。

一个 tidyverse 解决方案会很棒,但任何指导都会非常感激!我尝试了一些“传播”/“总结”的变体,但似乎无法正确。

【问题讨论】:

  • 请使用dput(head(df,n)) 而非图像 添加数据。查看更多here

标签: r dplyr


【解决方案1】:

试试这个base 解决方案:

#Data manipulation
df$study_id <- trimws(df$study_id)
df$question <- trimws(df$question)
df$response <- trimws(df$response)
df$Index <- as.numeric(df$response)
df$Index2 <- ifelse(is.na(df$Index),'response','rt')
df$Index <- NULL
df <- as.data.frame(df)
#Reshape
DataG <- reshape(df, idvar=c('study_id','question'), timevar='Index2', direction="wide")
DataG <- DataG[,c(1,2,4,3)]
rownames(DataG)<-NULL

         study_id        question response.response response.rt
1 02ipnnqgeovkrxz 37tlJa09k7zwKFL              word       0.839
2 02ipnnqgeovkrxz 3WTpbAzIQmbnlpb              word       0.739
3 02ipnnqgeovkrxz 3eEVJgaAP6c9FPL           picture       1.353
4 0bsilzm5iabdnoj 7QhOyTdA1MjKmX3              word       1.418
5 0bsilzm5iabdnoj 8eMvvNHEh1CAqk5              word       1.563
6 0bsilzm5iabdnoj e3u9ZmoNISb0vfn              word       6.377
7 1171bwmljjct6me 3IDmpN1FZDQqhcF           picture       1.795
8 1171bwmljjct6me 3WRNXeyBSwuXvh3           picture       1.876
9 1171bwmljjct6me 6QnjC0CHjV1kmvX           picture        0.96

【讨论】:

  • 非常感谢 - 我稍微调整了一下以适应我的 tidyverse 管道,它似乎工作得很好:) df &lt;- df %&gt;% mutate(temp_index = as.double(response)) %&gt;% mutate(index = ifelse(is.na(temp_index),'response','rt')) %&gt;% select(-temp_index) %&gt;% as.data.frame() df &lt;- reshape(df, idvar=c('study_id','question'), timevar='index', direction="wide") %&gt;% as_tibble(df, .name_repair)
【解决方案2】:

我认为最简单的方法是创建另一个变量来指定响应的类型,然后使用来自data.tabledcast 来重塑您的数据。

这样,假设 df 是您的数据框:

#which is numeric and which is not
df$type_var <- is.na(as.numeric(df$response)) 
df$type_var <- ifelse(df$type_var,"rt","response") # replacing with labels

#reshaping
data.table::dcast(df, id + question ~ type_var, value.var="response")

【讨论】:

  • 我理解这背后的逻辑 - 谢谢。但是最后一行对我来说导致以下错误: unique.default(x) 中的错误:unique() 仅适用于向量此外:警告消息:在 data.table::dcast(df, id + question ~ type_var, value.var = "response") : data.table 中的 dcast 泛型已通过 grouped_df 并将尝试重定向到 reshape2::dcast;请注意,不推荐使用 reshape2,现在也不推荐使用此重定向。请像 reshape2::dcast(df) 一样自己执行此重定向。在下一版本中,此警告将变为错误。
【解决方案3】:

假设每个问题有 2 行:第 1 行用于数字响应,第 2 行用于字符响应,那么我们可以通过交替行和列绑定来子集:

ix <- rep_len(c(FALSE, TRUE), nrow(df))
cbind(df[ix, ], rt = as.numeric(unlist(df[!ix, 3])))

#          study_id        question response    rt
# 1 02ipnnqgeovkrxz 37tlJa09k7zwKFL     word 0.839
# 2 02ipnnqgeovkrxz 3WTpbAzIQmbnlpb     word 0.739
# 3 02ipnnqgeovkrxz 3eEVJgaAP6c9FPL  picture 1.353
# 4 0bsilzm5iabdnoj 7QhOyTdA1MjKmX3     word 1.418
# 5 0bsilzm5iabdnoj 8eMvvNHEh1CAqk5     word 1.563
# 6 0bsilzm5iabdnoj e3u9ZmoNISb0vfn     word 6.377
# 7 1171bwmljjct6me 3IDmpN1FZDQqhcF  picture 1.795
# 8 1171bwmljjct6me 3WRNXeyBSwuXvh3  picture 1.876
# 9 1171bwmljjct6me 6QnjC0CHjV1kmvX  picture 0.960
      

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多