根据条件将列添加到数据框中

时间:2017-02-27 22:31:24

标签: r

我有一个看起来像这样但有20个级别的数据框。

df <- data.frame(
    x = factor(c("alpha","beta","gamma","delta")),
    y = factor(c("alpha","beta","gamma","delta")),
    z = factor(c("alpha","beta","gamma","delta"))

我想基于其他三个列在数据框中创建一个列。

df$w<-with(df,ifelse(df$z==df$x,df$y,df$x))

但它没有回馈列的内容,只是水平。

2 个答案:

答案 0 :(得分:3)

编辑: 你的代码并不错。 您只需将结果重新转换为如下因素:

 df<-data.frame(B=c("A","B","C","C"), C=c("A","C","B","B"), D=c("B","A","C","A") )   
df$A<-levels(df$B)[with(df,ifelse(df$B==df$C,df$D,df$C))]

要了解为什么会发生这种情况,你必须看看ifelse的作用:

debugonce(ifelse)
ifelse(df$B==df$C,df$D,df$C)

记住&#34;因子变量在内部存储为数字变量及其级别。数字变量的实际值为1,2,依此类推。&#34; 特别是如果ifelse分配给答案向量布尔值,那就是从逻辑向量开始。然后基于测试比较,ifelse子集这个ans向量分配&#34;是&#34;值。所以R保持向量表示。

简单地说,这样的事情会发生,你会失去因素代表

   a<-c(TRUE,FALSE)
   a[1]<-df$D[1]
   df$D
   a

尝试这个工作示例(另一种做同样事情的方法)

df<-data.frame(B=c("A","B","C","C"), C=c("A","C","B","B"), D=c("B","A","C","A") )

f<-data.frame(b,c,d)
df
f<-function(x,y,z){
  if(x==y){
    z
  }else{
    y
  }
}

df$A<-unlist(Map(f,df$B,df$C,df$D))

答案 1 :(得分:-1)

适合我?

def give_me_a_list(lst):
    lst = list(lst)  # makes a shallow copy
    # ...


def give_me_an_array(arr):
    arr = np.array(arr)  # makes a copy at least if you don't pass in "copy=False".
    # ...