[R] About change columns and specific rows in R

William Michels wjm1 at caa.columbia.edu
Tue May 23 09:34:34 CEST 2017


Hi Ivan,

I was just writing a follow-up note as your note came in. While the
code I posted previously works fine, using which() is unnecessary.

> DF <- read.csv("~/lily.csv")
> DF$product1_1 <- NA
> DF$product1_1 <- DF[DF$month == 1, "product1"]*3.1
Error in `$<-.data.frame`(`*tmp*`, "product1_1", value = c(55.8, 58.9,  :
  replacement has 4 rows, data has 7
> DF$product1_1 <- DF[which(DF$month == 1), "product1"]*3.1
Error in `$<-.data.frame`(`*tmp*`, "product1_1", value = c(55.8, 58.9,  :
  replacement has 4 rows, data has 7
> DF[DF$month == 1, "product1_1"] <- DF[DF$month == 1, "product1"]*3.1
> DF
  year month day product1 product2 product3 product1_1
1 1981     1   1       18       56       20       55.8
2 1981     1   2       19       45       22       58.9
3 1981     1   3       16       48       28       49.6
4 1981     1   4       19       50       21       58.9
5 1981     2   1       17       49       25         NA
6 1981     2   2       20       47       23         NA
7 1981     2   3       21       52       27         NA
>

The two errors above were caused because I failed to specify rows on
the left hand side of the assignment operator, not because I failed to
use which(). Once rows and columns are specified on both sides, the
assignment works fine.

(I do however, prefer to create an "NA" column first. Personal preference ;-).

Best Regards,

Bill.



On Mon, May 22, 2017 at 11:57 PM, Ivan Calandra <calandra at rgzm.de> wrote:
> Hi,
>
> Actually, you don't need to create the column first, nor to use which:
> DF[DF$month==1, "product1_1"] = DF[DF$month==1, "product1"] * 3.1
>
> The "[" is a great tool that you need to learn. In this case, you don't need
> to combine "[" and $: within the square brackets, the vector before the
> comma indexes the rows and the one after the comma indexes the columns.
>
> The other thing you were missing correctly referencing the rows. You have to
> specify the data.frame you want to look into.
>
> And last, learn to use dput() to provide a nice reproducible example.
>
> HTH,
> Ivan
>
>
> --
> Dr. Ivan Calandra
> TraCEr, Laboratory for Traceology and Controlled Experiments
> MONREPOS Archaeological Research Centre and
> Museum for Human Behavioural Evolution
> Schloss Monrepos
> 56567 Neuwied, Germany
> +49 (0) 2631 9772-243
> https://www.researchgate.net/profile/Ivan_Calandra
>
> On 23/05/2017 08:45, William Michels via R-help wrote:
>>
>> Hi Lily,
>>
>> You're on the right track, but you should define a new column first
>> (filled with NA values), then specify the precise rows and columns on
>> both the left and right hand sides of the assignment operator that
>> will be altered. Luckily, this is pretty easy...just remember to use
>> which() on the right hand side of the assignment operator to get the
>> index of the rows you want. Example below for "product1":
>>
>>> DF$product1_1 <- NA
>>> DF[DF$month == 1, "product1_1"] <- DF[which(DF$month == 1),
>>> "product1"]*3.1
>>>
>>
>> HTH,
>>
>> Bill.
>>
>> William Michels, Ph.D.
>>
>>
>>
>>
>> On Mon, May 22, 2017 at 9:56 PM, lily li <chocold12 at gmail.com> wrote:
>>>
>>> Hi R users,
>>>
>>> I have a question about manipulating the dataframe. I want to create a
>>> new
>>> dataframe, and to multiply rows with different seasons for different
>>> constants.
>>>
>>> DF
>>> year   month   day   product1   product2   product3
>>> 1981     1          1         18              56            20
>>> 1981     1          2         19              45            22
>>> 1981     1          3         16              48            28
>>> 1981     1          4         19              50            21
>>> 1981     2          1         17              49            25
>>> 1981     2          2         20              47            23
>>> 1981     2          3         21              52            27
>>>
>>> For example, how to multiply product1 in month1 by 3.1, and to multiply
>>> product3 in month2 by 2.0? I wrote the code like this but does not work.
>>> Thanks for your help.
>>>
>>> DF['month'==1, ]$product1_1 = DF['month'==1, ]$product1 * 3.1;
>>> DF['month'==2, ]$product3_1 = DF['month'==1, ]$product3 * 2.0;
>>>
>>>          [[alternative HTML version deleted]]
>>>
>>> ______________________________________________
>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>> PLEASE do read the posting guide
>>> http://www.R-project.org/posting-guide.html
>>> and provide commented, minimal, self-contained, reproducible code.
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
>> http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list