Я хотел бы добавить содержимое вектора во фрейм данных. Например, у меня есть такой вектор:

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

Потому что есть три 1, два 2 и один 4 в векторе.

Я не знаю, был ли я достаточно ясен, но спасибо!

4
Oscar 20 Авг 2018 в 14:33

5 ответов

Лучший ответ
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)
2
Lennyy 20 Авг 2018 в 12:17

Если имена столбцов такие же, как вы указали в своем вопросе, то что-то вроде:

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

Где vec - ваш вектор, а df - ваш фрейм данных.

Если имена столбцов не имеют значения, кроме индекса столбцов, замените cols на

cols <- as.numeric(names(tb))
2
989 20 Авг 2018 в 12:16

Потому что есть три 1, два 2 и один 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)
2
markus 20 Авг 2018 в 12:47

Скорее всего, есть функция, которая делает то же самое; Тем не менее, я думаю, что этот код может работать для вас.

Тестовый набор вектора и фрейма данных,

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
  }}
1
Shapour 20 Авг 2018 в 12:18

Вы можете использовать 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)     
0
milan 20 Авг 2018 в 11:41
51929892