R 如何有条件地将多个列中的值拉入新列?

R 如何有条件地将多个列中的值拉入新列?,r,if-statement,conditional-statements,recode,R,If Statement,Conditional Statements,Recode,我是一个相对新手的R用户,虽然熟悉dplyr和tidy verse。我似乎仍然不知道如何将一列中的实际数据(如果它满足特定条件)拉入到一个新列中 这就是我要做的。参与者对具体实践进行了排名(n=5),并回答了代表他们对这些实践信念的问题。我想有五个新专栏,将他们对实践的信念分配给他们的级别,而不是实践 例如,他们有一个名为NI.confidences的“关于NI的信念”得分,如果参与者将NI列为他们的第一选择,我希望NI.confidences的值被拉到first.confidences的新列中

我是一个相对新手的R用户,虽然熟悉dplyr和tidy verse。我似乎仍然不知道如何将一列中的实际数据(如果它满足特定条件)拉入到一个新列中

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

例如,他们有一个名为NI.confidences的“关于NI的信念”得分,如果参与者将NI列为他们的第一选择,我希望NI.confidences的值被拉到first.confidences的新列中。同样的道理,如果参与者将pmii作为他们的首选实践,他们对pmii.confidences的价值应该被拉到first.confidences列中

因此,我需要五个新的列,称为:first.belies,second.belies,third.belies,fourth.belies,last.belies,然后我需要每个列有条件地从依赖于实践特定等级的实践特定信念(ni.belies,dtt.belies,pmi.belies,sn.belies,script.believes)中提取数据(每个机构的排名为1-5,分别为rank.ni、rank.dtt、rank.pmi、rank.sn、rank.script)

这是我到目前为止所拥有的,但我被卡住了,并且意识到这不是很接近。任何帮助都是感激的

`


Diss$first.confidences使用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
)
库(dplyr)

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

在不使用其他包的情况下,如果排名列相当于您想要的新列的索引(即,他们将每个实践从1到5进行排名,没有重复,并且顺序与新列“第一信念、第二信念等”相同),那么您可以使用该数据作为第二组列的索引:

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]
...
}

这应该行得通。它很简单,不需要软件包,而且速度也很快。只要确保你先初始化/创建了新的列,否则你会得到一些错误。如果你有一些样本数据吗?@mariah在s.O.上提问时,这是一项政策,以使它们“可复制”。人们没有你的数据,但(例如)你能用iris数据(?)来表明你的观点并让其他人复制你的想法吗?谢谢你!!我当时一直在考虑申请case_,但不知道它是如何从其他专栏中获得价值的。非常感谢你!如果你能投票支持我的答案,那么我就可以继续提高我的声誉了:)谢谢,塞巴斯蒂安!上面来自user2332849的代码有效,因此我最终不需要它,但我认为您的逻辑和代码是有意义的!
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