我是R的新手,所以请耐心等待我。
我有两个数据帧:
df1 <- data.frame(name = c("name 1", "name 2", "name 3", "name 4"),
columnname = c("hello", "", "hello", ""))
df2 <- data.frame(name = c("name 1", "name 2", "name 3"),
columnname = c(1, 2, 3))
看起来像:
df1
#name columnname
#name 1 hello
#name 2
#name 3 hello
#name 4
df2
#name columnname
#name 1 1
#name 2 2
#name 3 3
我的目标是取代价值&#34;你好&#34;在df1中使用df2中的相应值(否则为NA),并创建一个新的数据帧df3。到目前为止,我有以下代码:
fun <- function(cat_df, ret_df, col_name) {
ret_df[, col_name] <- ifelse(cat_df[, col_name] == "hello", ret_df[, col_name],"NA")
return(ret_df)
}
df3 <- fun(df1, df2, col_name = "columnname")
df3
#name columnname
#name 1 1
#name 2 NA
#name 3 3
#name 4 NA
但是,我有350列和3000行。所以我的问题是,如何扩展代码以保存350列和3000行的数据帧?其他类型的代码非常受欢迎!
答案 0 :(得分:1)
因为你想要一个多列的解决方案,我们首先创建一些包含多列的数据(你可以自己完成这个......)
set.seed(4)
nobs=5
df1 <- data.frame(name=paste("name",1:nobs))
df1[,paste0("col",1:5)] <- sample(c("hello",""),5*nobs,T)
# name col1 col2 col3 col4 col5
# 1 name 1 hello hello
# 2 name 2 hello hello
# 3 name 3 hello hello
# 4 name 4 hello hello
# 5 name 5 hello hello
df2 <- data.frame(name=paste("name",1:nobs))
df2[,paste0("col",1:5)] <- 1:nobs
# name col1 col2 col3 col4 col5
# 1 name 1 1 1 1 1 1
# 2 name 2 2 2 2 2 2
# 3 name 3 3 3 3 3 3
# 4 name 4 4 4 4 4 4
# 5 name 5 5 5 5 5 5
然后我们创建一个命名的列向量
mycols <- colnames(df1)[-1]
names(mycols) <- mycols
并制作我们的结果
df3 <- data.frame(name=df1$name)
df3[mycols]<- lapply(mycols,function(x){
ifelse(df1[,x]=="hello",df2[,x],NA)
})
name col1 col2 col3 col4 col5
1 name 1 NA 1 NA 1 NA
2 name 2 2 NA 2 NA NA
3 name 3 3 NA 3 NA NA
4 name 4 4 NA NA NA 4
5 name 5 NA 5 5 NA NA
答案 1 :(得分:0)
因此,如果我的两个数据框的尺寸为:
dim(df1)
639 260
and dim(df2)
2273 260
代码会是这样的:
set.seed(4)
nobs=2273
df1 <- data.frame(name=paste("name",1:nobs))
df1[,paste0("col",1:260)] <- sample(c("hello",""),260*nobs,T)
df2 <- data.frame(name=paste("name",1:nobs))
df2[,paste0("col",1:260)] <- 1:nobs
mycols <- colnames(df1)[-1]
names(mycols) <- mycols
df3 <- data.frame(name=df1$name)
df3[mycols]<- lapply(mycols,function(x){
ifelse(df1[,x]=="hello",df2[,x],NA)
})
df3