我有一个看起来像这样但有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))
但它没有回馈列的内容,只是水平。
答案 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".
# ...