用字符串值替换数值

时间:2018-01-25 22:02:22

标签: r string

我是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 - 但实际上并不是我想要做的。

3 个答案:

答案 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

这个解决方案也非常简单!