如何有条件地将多列中的值提取到新列中?

How do I pull the values from multiple columns, conditionally, into a new column?

我是一个相对新手的R用户,虽然熟悉dplyr和tidy verse。我似乎仍然无法弄清楚如何将满足特定条件的一列中的实际数据提取到新列中。

这就是我想要做的。参与者对特定实践 (n=5) 进行了排名,并对代表他们对这些实践的信念的问题做出了回答。我想有五个新专栏,将他们对实践的信念分配给他们的队伍,而不是实践。

例如,他们有一个 "beliefs about NI" 的分数叫做 ni.beliefs,如果参与者将 NI 列为他们的第一选择,我希望 ni.beliefs 的值被拉入first.beliefs 的新专栏。如果参与者将 pmii 作为他们的第一选择实践,那么他们对 pmii.beliefs 的值应该被拉入 first.beliefs 列也是如此。

所以,我需要五个新的列:first.beliefs、second.beliefs、third.beliefs、fourth.beliefs、last.beliefs 然后我需要其中的每一个有条件地从实践特定信念(ni.beliefs、dtt.beliefs、pmi.beliefs、sn.beliefs、script.beliefs)中提取数据,具体取决于实践特定等级(为每个练习分配 1-5 的等级,rank.ni、rank.dtt、rank.pmi、rank.sn、rank.script)。

这是我目前所拥有的,但我被卡住了,并且意识到这不是很接近。感谢您的帮助!!!

`

Diss$first.beliefs <-ifelse(rank.ni==1, ni.beliefs,
                    ifelse(rank.dtt==1, dtt.beliefs,
                           ifelse(rank.pmi==1, pmi.beliefs,
                                  ifelse(rank.sn, sn.beliefs,
                                         ifelse(rank.script==1, script.beliefs)))))

`

谢谢!!

这可以通过 case_when() 函数轻松完成。您可以改进以下代码。

library(dplyr)

Diss$first.beliefs <- case_when(
  rank.ni == 1 ~ ni.beliefs,
  rank.dtt == 1 ~ dtt.beliefs,
  rank.pmi == 1 ~ pmi.beliefs,
  rank.sn ~ sn.beliefs,
  rank.script == 1 ~ script.beliefs
)

我不确定我是否理解正确(如果你展示你的数据是什么样子会有所帮助),但这就是我的想法:

在不使用额外包的情况下,如果排名列等同于您想要的新列的索引(即它们将每个实践从 1 到 5 排名,没有重复,并且与新列的顺序相同 "firsts belief, second belief, etc"),那么您可以使用该数据作为第二组列的索引:

for(j in 1:nrow(people_table)){
people_table[j,]$first.belief[[1]] <- names(beliefs)[(people_table[j,c(A:B)]) %in% 1]
people_table[j,]$second.belief[[1]] <- names(beliefs)[(people_table[j,c(A:B)]) %in% 2]
...
}

在哪里

A -> index of the first preference rank column

B -> index of the last preference rank column

(people_table[j,c(A:B)] %in% 1) -> this returns something like (FALSE FALSE TRUE FALSE FALSE)

beliefs -> vector with the names of each belief

应该可以。很简单,不需要包,而且速度也很快。只需确保先 initialized/created 新列,否则会出现一些错误。如果