当前位置: 首页 > 知识库问答 >
问题:

基于一个行值更改多个行值的雄辩的R解决方案

班建义
2023-03-14

长期潜伏者,首次海报。我对R比较陌生,我正在清理一个200行的调查数据集。该调查使用了相当多的分支,并且在参与者没有收到问题的情况下返回NAs,因此它抛开了我缺失的数据分析。我花了一天半的时间试图找出一个雄辩的解决方案(用于循环、if条件、filter(dplyr)、mutate(dplyr)、case_when)。我确定了一个使用mutate()的解决方案,但我知道有更好的方法来实现这一点。

df <- data.frame(attsess1 = c(1, 1, 1, -99, -99), attsess2 = c(-99, -99, 1, 1, 1), s1satis = c(1, 1, 1, NA, NA), s1time = c(1, 1, 1, NA, NA), s1qual = c(1, 1, NA, NA, NA), s2satis = c(NA, NA, NA, 1, 1), s2time = c(NA, NA, 1, 1, 1))
library(dplyr)
df1 <- df %>% mutate(s1satis = case_when(attsess1 == -99 ~ -99)) %>% mutate(s1time  = case_when(attsess1 == -99 ~ -99)) %>% mutate(s1qual = case_when(attsess1 == -99 ~ -99)) %>% mutate(s2satis = case_when(attsess2 == -99 ~ -99)) %>% mutate(s2time = case_when(attsess2 == -99 ~ -99))

我尝试使用mutate_at和case_when,但收到了这个错误消息:必须是双向量,而不是整数向量。我还尝试了用if条件嵌套的循环,但我不记得收到的错误消息。我还碰到几个论坛,在那里作者们提倡替换dplyr函数的for循环--有谁能提供更多关于这一点的见解吗?

谢谢你的帮助!

共有1个答案

邵弘致
2023-03-14

确保您的dplyr版本已更新,并且此想法应该起作用:

df %>%
  mutate(
    across(starts_with("s1"), ~ case_when(attsess1 == -99 ~ -99, TRUE ~ .)),
    across(starts_with("s2"), ~ case_when(attsess2 == -99 ~ -99, TRUE ~ .))
  )

#   attsess1 attsess2 s1satis s1time s1qual s2satis s2time
# 1        1      -99       1      1      1     -99    -99
# 2        1      -99       1      1      1     -99    -99
# 3        1        1       1      1     NA      NA      1
# 4      -99        1     -99    -99    -99       1      1
# 5      -99        1     -99    -99    -99       1      1

虽然我不太确定你想要的结果,但请看我对你问题的评论。

 类似资料:
  • 我有一个表:配置文件表有一个外键和主键。我想更新行基于两个条件。id==1和user=='admin' 如何使用两个参数更新查询使用雄辩。

  • 我有一个类似下面的数据帧,其中所有ID都是唯一的,列a、B和C的值都在0和1之间。 我想只保留A、B和C的前n个值,这样对于n=2,数据帧看起来如下: 做df.set_index('ID')['A']. n最大(2).reset_index()给我: 有没有比三次合并数据集更简单的方法?

  • 我试图用Python复制我的Stata代码,我被指向熊猫的方向。然而,我很难思考如何处理数据。 假设我想遍历列标题“ID”中的所有值。如果该ID与一个特定的数字匹配,那么我想更改两个相应的值FirstName和LastName。 在Stata,它看起来像这样: 因此,这将替换 FirstName 中与 ID == 103 到 Matt 的值对应的所有值。 在熊猫身上,我正在尝试这样的东西 不知道该

  • 本文向大家介绍python实现一行输入多个值和一行输出多个值的例子,包括了python实现一行输入多个值和一行输出多个值的例子的使用技巧和注意事项,需要的朋友参考一下 注:以下内容在python3中操作 一. 一行输入多个值 具体操作如下: 具体操作如下: 补充split( ): 二. 一行输出多个值 注:python中print()会自动换行,具体如下: 具体操作如下: 以上这篇python实现

  • 我想写一个函数,迭代通过一个帐户列表,每个帐户都有一个相关联的值,并分配该帐户与名称列表中的一个名称。名称列表将有相关联的值,我希望分配的名称是具有最小值的名称。 我想的是迭代帐户列表,看看名字列表。首先看acc1,将其分配给名字列表的最小值。acc1的名字变成杰西卡,杰西卡的总价值被acc1值增强...杰西卡变成27,然后acc2去杰西卡再次使杰西卡35,acc3然后找到马特谁是现在的最小,并相