我是R的初学者。我正在尝试将数据库中存储的单元格的名称替换为数据值“1”。
这是我一直在尝试的可再现的例子:
name1 <- c("1", "0", "0")
name2 <- c("0", "1", "0")
name3 <- c("0", "0", "1")
nameCollection <- cbind(name1, name2, name3)
names <- colnames(nameCollection)
for (j in 1:ncol(nameCollection)) {
for(i in 1:nrow(nameCollection)) {
if(nameCollection[i,j] == 1){
nameCollection[i,j] <- names[i]
}
}
}
当您运行上面的代码时,它会起作用,但不适用于实际的数据框(csv文件)。
当我使用我的数据框尝试时,这是R正在打印的错误消息:
[.data.table
(a,i,j)中的错误: j([...]内的第二个参数)是单个符号,但未找到列名'j'。也许你打算DT [,.. j]或DT [,j,= FALSE]。这种与data.frame的差异是经过深思熟虑的,并在FAQ 1.1中进行了解释。
如果有人知道我需要做什么,请给我一个帮助。
谢谢!
p.s:我尝试过这种方法 - Replace numeric values for text values - 但实际上并不是我想要做的。
答案 0 :(得分:1)
我通常会使用数据框,但是下面你会发现一种方法可以用数据框和矩阵来完成。还有其他方法可以做到这一点,但这会让你到那里。
name1 <- c("1", "0", "0")
name2 <- c("0", "1", "0")
name3 <- c("0", "0", "1")
#With at data frame
df_nameCollection <- data.frame(name1, name2, name3, stringsAsFactors = F)
df_names <- colnames(df_nameCollection)
for (name in df_names) {
#The following selects all of the columns named name then all of the
#values equal to 1 and sets them to name
nameCollection[name][nameCollection[name] == "1"] <- name
}
#With a matrix
m_nameCollection <- cbind(name1, name2, name3)
m_names <- colnames(m_nameCollection)
for(i in 1:length(m_names)){
m_nameCollection[,i][m_nameCollection[,i] == "1"] <- m_names[i]
}
答案 1 :(得分:0)
如果您使用data.table
,那么您可以执行以下操作:
name1 <- c(1,0,0)
name2 <- c(0,1,0)
name3 <- c(0,0,1)
nameCollection <- cbind.data.frame(name1, name2, name3)
library(data.table)
dat=setDT(cbind.data.frame(ind=row.names(nameCollection),nameCollection))
dcast(melt(dat,"ind")[,v:=`is.na<-`(variable,value==0)],ind~variable,value.var = "v")[,2:4]
name1 name2 name3
1: name1 NA NA
2: NA name2 NA
3: NA NA name3
使用基数R:
nameCollection[]=Map(function(x,y)replace(x,x==1,y),nameCollection,names(nameCollection))
nameCollection
name1 name2 name3
1 name1 0 0
2 0 name2 0
3 0 0 name3
答案 2 :(得分:0)
为什么在将变量绑定到数据帧之前找不到并替换?这样你就可以避免for循环。
# your original code
name1 <- c("1", "0", "0")
name2 <- c("0", "1", "0")
name3 <- c("0", "0", "1")
# substitute all instances of 1 with the string name
name1 <- gsub(x = name1, pattern = "1", replacement = "name1")
name2 <- gsub(x = name2, pattern = "1", replacement = "name2")
name3 <- gsub(x = name3, pattern = "1", replacement = "name3")
# bind it to a dataframe, not a matrix (you originally did matrix but in your question you say it's a dataframe
nameCollection <- as.data.frame(cbind(name1, name2, name3))
# this is the output
> nameCollection
name1 name2 name3
1 name1 0 0
2 0 name2 0
3 0 0 name3
这个解决方案也非常简单!