在R中的矩阵中添加字符

时间:2018-08-12 13:13:05

标签: r dataframe

我通过导入csv。

data<-read.csv('test.csv')

然后数据才有价值

> data
  name a b c d
1    a 1 2 1 1
2    b 2 2 2 4

现在我希望在数据底部添加行,所以我添加

results <- c('aa',2,3,4,5)
data[nrow(data)+1,]<-results

但这会导致我交战并且未插入字符值。

Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "aa") :
  invalid factor level, NA generated

并且数据的值=

> data
  name a b c d
1    a 1 2 1 1
2    b 2 2 2 4
3 <NA> 2 3 4 5

但我想拥有

> data
  name a b c d
1    a 1 2 1 1
2    b 2 2 2 4
3    aa 2 3 4 5

我是R语言的新手,已经尝试了多个小时,因此我们将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:2)

能否请您尝试以下操作:(我将数据放入此处,您可以使用dat <- read.table(text = "name a b c d 1 a 1 2 1 1 2 b 2 2 2 4", header = TRUE,stringsAsFactors = FALSE) dat results <- c('aa',2,3,4,5) rbind(dat,results)

stringAsFactors = FALSE

输出(不使用 name a b c d 1 a 1 2 1 1 2 b 2 2 2 4 3 <NA> 2 3 4 5 Warning message: In `[<-.factor`(`*tmp*`, ri, value = "aa") : invalid factor level, NA generated ):

  name a b c d
1    a 1 2 1 1
2    b 2 2 2 4
3   aa 2 3 4 5

没有警告消息的输出:

$.alert({
  title: 'Room display errors!',
  content: 'Room ' + result + '<BR/>',
  icon: 'fa fa-rocket',
  animation: 'zoom',
  boxWidth: '50%',
  closeAnimation: 'zoom',
  buttons: {
    okay: {
      text: 'Acknowledge',
      btnClass: 'btn-blue'
      window.top.location.href = 'confmon_a.php', // ERROR HERE
    }
  },

cancel: function() {
  $.alert('canceled');
}
});

答案 1 :(得分:2)

这里有几个问题:

  1. 第一列是一个因素,因此您只能添加该因素具有的水平。
  2. 如果c(...)与字符和数字混合使用,则结果为字符。
  3. data是一个data.frame,而不是一个矩阵-这个问题错误地指出它是一个矩阵。 (如果它是矩阵,那么它将是字符矩阵,因为您不能在矩阵中混合使用字符和数字。)

要解决这些问题,请在as.is = TRUE中使用read.csv并使用list而不是c

data <- read.csv("test.csv", as.is = TRUE)
data[nrow(data) + 1, ] <- list('aa',2,3,4,5)

给予:

> data
  name a b c d
1    a 1 2 1 1
2    b 2 2 2 4
3   aa 2 3 4 5

注意

可复制形式的文件是从以下位置生成的:

Lines <- "name a b c d
1    a 1 2 1 1
2    b 2 2 2 4
"
temp <- read.table(text = Lines, as.is = TRUE)
write.csv(temp, "test.csv", row.names = FALSE, quote = FALSE)

答案 2 :(得分:1)

这应该有效。

data <- read.csv('test.csv', stringsAsFactors = FALSE)

在简短的说明中,默认情况下read.csv将每个字符列都视为一个因素。因子是一类特殊的数据,只能在创建时确定几个值。

答案 3 :(得分:1)

将'aa'作为levels之一,它应与OP的factor列一起使用。另外,由于list可以容纳不同的type而不是向量(由c组成),因此请为下一行分配一个list作为输入

levels(data$name) <- c(levels(data$name), 'aa')
data[nrow(data) +1,] <- list('aa', 2, 3, 4, 5)
data
#  name a b c d
#1    a 1 2 1 1
#2    b 2 2 2 4
#3   aa 2 3 4 5

数据

data <- structure(list(name = structure(1:2, .Label = c("a", "b"),
 class = "factor"), 
a = 1:2, b = c(2L, 2L), c = 1:2, d = c(1L, 4L)), .Names = c("name", 
 "a", "b", "c", "d"), row.names = c("1", "2"), class = "data.frame")