2014-10-10 141 views
1

我已经看过类似的帖子,但没有得到任何工作。根据R中的其他列创建新的数据帧列

我有一个字符为1,2,3,4,5的列,它们是面试问题的答案 我想要一个新列,当回答是1或2时,新列是否,当回答是3新列是Partly,当回答是4或5时是Yes,其他都是NA。

data.frame': 405 obs. of 1 variables: 
$ SQ023A  : chr "-3" "-3" "-3" "-3" ...(this has -1, -2, -3, -4, 1, 2, 3, 4, 5, Yes, No, Partly) 

新列应保持是,否,可能有答案,但有部分代替1和2号,4和5是的,3。其他都是NA。

我曾尝试没有成功以下

sq23$test <- ifelse(("1"|"2", sq23$SQ23A), "No", 
      ifelse("4"|"5", sq23$SQ23A), "Yes", 
      ifelse("3", sq23$SQ23A), "Partly","NA")) 
+0

请访问:http://stackoverflow.com/questions/26290876/how-can-i-add-a-column-based-on-condition-in-r/26292010?noredirect=1#comment41261414_26292010 – KFB 2014-10-10 11:12:35

回答

3

尝试:

sq23$test <- c("No","No","Partly","Yes","Yes")[as.numeric(sq23$SQ23A)] 

编辑:

在你编辑的光,我要去给一个更通用的解决方案这种问题。首先我们建立一个包含我们想要替换的旧值的向量。然后,我们定义另一个有替换的向量。然后我们通过match函数来完成这个技巧。例如:

#create a sample of your data 
    sq23<-data.frame(SQ023A=sample(c(-4:5,"Yes","No","Partly"),size=405,replace=TRUE)) 
    #define the old values to replace 
    oldValues<-c(1:5,"Yes","No","Partly") 
    #define the replacement (each value of newValues replace the corresponding of oldValues) 
    newValues<-c("No","No","Partly","Yes","Yes","Yes","No","Partly") 
    #create the test column 
    sq23$test<-newValues[match(sq23$SQ023A,oldValues)] 
+0

嗯我得到一个没有添加列的错误(sq23 $ SQ023A)] 错误c(“否”,“否”,“否”,“部分”,“是”,“是” “,”部分“,”是“,”是“)[as.numeric(sq23 $ SQ023A)]:只有0可能与否定下标混合在一起此外:警告消息:强制引入NAA – Jen 2014-10-10 11:09:53

+0

我看到您的编辑并已更改我的答案。看一看,看看它是否有帮助。 – nicola 2014-10-10 12:30:33

+0

感谢:-)这是一个非常巧妙的把戏。我导出了文件并检查了它的准确性。如果在原始列中没有存在“是”,“否”或“部分”,我还检查了以下方法。如果你这样做的话,他们会用NA来写,而受访者的回应将会丢失。 再次感谢你,让我的星期五。 sq23 $ test < - 不适用 sq23 $ test [sq23 $ SQ23A == 1 | sq23 $ SQ23A == 2] < - “否” sq23 $ test [sq23 $ SQ23A == 4 | sq23 $ SQ23A == 5] < - “是” sq23 $ test [sq23 $ SQ23A == 3] < - “部分” – Jen 2014-10-10 12:58:37

3

为清楚起见,我会做:

sq23$test<- NA 
sq23$test[sq23$SQ23A == 1 | sq23$SQ23A == 2]<- "No" 
sq23$test[sq23$SQ23A == 4 | sq23$SQ23A == 5]<- "Yes" 
sq23$test[sq23$SQ23A == 3]<- "Partly" 

根据您的编辑,以及更一般的情况下,你也可以使用一个字典类型的解决方案:

values<- c("no", "no", "partly","yes","yes","yes","no","partly") # new value 
names(values)<- c(1:5, "yes", "no", "partly") # keys 
> values 
     1  2  3  4  5  yes  no partly 
    "no"  "no" "partly" "yes" "yes" "yes"  "no" "partly" 
sq23$test<- values[as.character(sq23$SQ23A)] 
# as.character() used to make sure that the keys/old values are passed as 
# characters, and not e.g. a factor 
+0

非常感谢您的帮助。你的代码回答了我最初的问题,并将在我处理的其他一些情况下工作。祝你有美好的一天。 – Jen 2014-10-10 13:00:25

+0

@Jen我已经添加了另一个更通用的解决方案,基于您的编辑,只是为了显示可以完成的另一种方式(除了尼科拉)。 – fileunderwater 2014-10-10 13:29:18

相关问题