R将向量内容添加到数据帧索引

时间:2018-08-20 11:33:22

标签: r dataframe

我想将向量的内容添加到数据帧中。例如,我有一个像这样的向量:

1, 2, 1, 1, 2, 4

还有一个数据框,如:

Name1 Name2 Name3 Name4 Name5 Name6
    3     2     2     0     3     1

我想计算矢量中出现的数字,并将该数字添加到数据帧中的列索引中,因此在此示例中,我将得到一个数据帧,如:

Name1 Name2 Name3 Name4 Name5 Name6
    6     4     2     1     3     1

因为向量中有3个1、2 2和1 4。

我不知道我是否已经足够清楚,但是谢谢!

5 个答案:

答案 0 :(得分:2)

df + replace(vec, 1:6, tabulate(vec, 6))

  Name1 Name2 Name3 Name4 Name5 Name6
1     6     4     2     1     3     1

更一般的矿石,有一些解释:

df + replace(vec, 1:dim(df)[2], tabulate(vec, dim(df)[2]))
    #replace values in vec
    #list of values to be replaced: 1:6 (since you have 6 columns)
    #replaced by the occurence of each value in vec (using tabulate with nbins ensures each value between 1 and 6 is in the replacement list, with zeroes for 3, 5 and 6)   
    #finally, add it to df

数据:

vec <- c(1, 2, 1, 1, 2, 4)

df <- read.table(text = "
                 Name1 Name2 Name3 Name4 Name5 Name6
    3     2     2     0     3     1", h = T)

答案 1 :(得分:2)

如果列名如您在问题中所述,则类似于:

tb <- table(vec)
cols <- paste0("Name", names(tb))
df[cols] <- df[cols] + tb

其中vec是您的向量,df是您的数据帧。

如果列名无关紧要,但是列的索引不存在,则将cols替换为

cols <- as.numeric(names(tb))

答案 2 :(得分:2)

  

因为向量中有3个1、2 2和1 4。

您可以将向量转换为因子,其水平达到1到数据中的列数。然后使用table计算出现的次数并将其添加到数据框中。

df + table(factor(vec, levels = 1:ncol(df)))
#  Name1 Name2 Name3 Name4 Name5 Name6
#1     6     4     2     1     3     1

数据

df <- structure(list(Name1 = 3L, Name2 = 2L, Name3 = 2L, Name4 = 0L, 
    Name5 = 3L, Name6 = 1L), .Names = c("Name1", "Name2", "Name3", 
"Name4", "Name5", "Name6"), class = "data.frame", row.names = c(NA, 
-1L))

vec <- c(1, 2, 1, 1, 2, 4)

答案 3 :(得分:1)

很可能有一个函数可以执行相同的操作;但是,我认为这段代码可能对您有用。

向量和数据帧的测试集,

o<-data.frame(round(runif(5,min = 1,max = 5 )))
q<-round(runif(5,min = 1,max = 5))

这是一个循环,用于对向量集中的数字进行计数并将数据帧集的值添加到所计数的数字上。

for (i in 1:dim(o)[1]){
  j=1
  while (j<=dim(o)[1]) {
  if(i==q[j]){o[i,1]<-o[i,1]+1}
    j<-j+1
  }}

答案 4 :(得分:0)

您可以使用loop。内部使用which来识别匹配项,并使用length来计算出现的次数。

a <- NULL
for(i in 1:length(v)){
  a <- c(a,length(which(v==i)))
}

df+a

  Name1 Name2 Name3 Name4 Name5 Name6
1     6     4     2     1     3     1

像这样读取您的数据。

v <- c(1, 2, 1, 1, 2, 4)

df <- read.table(text="
Name1 Name2 Name3 Name4 Name5 Name6
    3     2     2     0     3     1", header=T)