2016-11-22 2 views
0

У меня есть смешанный характер и целое dataframe в R:Сумма смешанных столбцов в R: сумма целых клеток, Соединить клетки символов

 NAME  ID  X  Y  Z 
1 apple a123p 1.0  2.0 3.0 
2 orange o483e 4.0  5.0 6.0 
3 grape g302e 1.0  1.5 2.0 

где единственный столбец Name содержит символы, а остальные столбцы (ID, X, Y, Z) содержат целые числа. Я хотел бы добавить некоторые столбцы вместе: суммирование целых чисел и объединение символов.

Желаемая выход если добавить яблоко + апельсин:

 NAME   ID    X  Y  Z 
1 apple   a123p   1.0  2.0 3.0 
2 orange   o483e   4.0  5.0 6.0 
3 grape   g302e   1.0  1.5 2.0 
4 apple_orange a123p_o483  5.0  7.0 9.0 

Возможно ли это? Я попытался найти учебники для dplyr и aggregate, но столкнулся с ошибками и путаницей. Я не уверен, есть ли что-то конкретное для моих нужд.

Спасибо.

+1

В чем логика добавления двух вещей - почему яблоко и апельсин? Вы хотите написать функцию, в которой имя может быть специфицировано как аргументы? и почему вывод становится новой строкой в ​​том же фрейме данных? – vagabond

+0

(1) Вы уверены, что 'ID' является целым числом? это не выглядит так ... (2) Тот же Q, что и @vagabond, который немного избил меня ... –

+0

Нет необходимости, чтобы выход был новой строкой в ​​том же фрейме данных, это может быть в новом df. В реальных данных у меня есть связанные элементы (то есть: version1, version2, version3) и вы хотите получить сумму различных комбинаций этих элементов. Но я хочу отслеживать, какие две версии были добавлены вместе: v1 + v3, v1 + v2, v2 + v3. – moxed

ответ

0

Создание индекса строк, где «NAME» либо «яблоко» или «оранжевый»

i1 <- df1$NAME %in% c("apple", "orange") 

затем найти целое число и характер столбцы

i2 <- sapply(df1, is.numeric) 

и использовать индексы для подмножества строки, столбцы, цикл через нецелые столбцы, paste их вместе, аналогично, через целочисленный столбец, получить sum, добавить list с вместе с c и rbind w с исходным набором данных

rbind(df1, c(lapply(df1[i1, !i2], paste, collapse="-"), lapply(df1[i1, i2], sum))) 
#   NAME   ID X Y Z 
#1  apple  a123p 1 2.0 3 
#2  orange  o483e 4 5.0 6 
#3  grape  g302e 1 1.5 2 
#4 apple-orange a123p-o483e 5 7.0 9 
+0

Выполнение ошибки с недопустимым коэффициентом, сгенерированной NA. Я думаю, что должно быть что-то не так с моими числовыми столбцами. Это действительно помогает конкатенации столбцов символов! – moxed

+0

@moxed В моем примере я использовал 'NAME' и 'ID' как класс 'character'. Вы можете сделать одно, прежде чем применять код 'df1 [1: 2] <- lapply (df1 [1: 2], as.character)' – akrun

+0

это работает СОВЕРШЕННО. Спасибо! Вопрос/любопытство новоиспеченного: если бы я не интересовался конкатенацией строк и просто хотел получить суммарные значения, я бы просто использовал функцию lapply? – moxed

Смежные вопросы