2017-01-06 73 views
1

對不起,如果這是重複的,我發現很多答案,您可以將數據框中的值更改爲基於另一列的數字或字符串,但它不會似乎在嘗試根據該值更改每個值時工作。R基於其他列的標準的R日期格式

所以我試圖用一些答案比如我讀R - Update a Value in One Column Based on Criteria in Other Columns

現在看看我的數據:

class(df[1,1]) 
[1] "character" 

>df[1,1] 

[1] "2015-03-01T00:00:00Z" 

>as.Date(df[1,1]) 

[1] "2015-03-01" 

所以我知道我可以將我的數據,我希望它看起來像。但是:

> df$a[df$b=="start"] <- as.Date(df$a[df$b=="start"]) 
> df[1,1] 
[1] "16495" 

我可以將它們全部更改爲數字串的,但是當我試圖在每個值由於某種原因做as.Date返回一個陌生的號碼

我趕緊嘗試:

lapply(df, function(x){if(df$b=="experience.start"){df$a<-as.Date(df$a)}}) 

雖然正確的值被打印到控制檯,我不知道如何使用它來編輯我的數據框。

+0

相關http://stackoverflow.com/questions/17030173/why-does-hello-0-return-true/17030209#17030209? – lukeA

+0

在我看來,你正試圖在一個列中有不同類別的數據,這是不可能的。關於「奇怪的數字」,16495是1970-01-01和2015-03-01之間的天數。這就是日期以數字格式表達的方式。 – Haboryme

回答

2

據我所知,你不能因爲你想有:

df$c <- as.Date(NA) 
df$c[df$b=="start"] <- as.Date(df$a[df$b=="start"]) 

的代碼,你有它,即使它的工作,如果將在連續運行兩次,產生不同的結果值爲屬於characterDate類的列。你不能以兩種方式解決問題。

首個解決方案

您可以通過這種方式創建另一列newdates

df$newdates <- as.Date(NA) 
df$newdates[df$b == "experience.start"] <- as.Date(df$a[df$b == "experience.start"]) 

與此代碼,你將有一些列NA填充,因爲不是所有的行都具有b列等於到experience.start

第二種解決

你可以同意的妥協和轉換Datecharacter

df$a[df$b == "experience.start"] <- as.character(as.Date(df$a[df$b=="experience.start"])) 

在這種方式中,a列的類型將是character,當b等於到experience.start,您會發現此格式的日期:2015-03-04,否則格式將爲2011-02-11T00:00:00Z

1

假設我理解你的數據框的設置,而不是將該值賦值給「a」變量,請創建一個新的Date變量並賦值給它。

由於Haboryme說,現有的「A」欄是一個字符向量,as.Date()返回Date對象,它被轉換上即時的角色 - 注意周圍"16495"引號。

通過分配給不同的變量,R會自動生成一個日期向量,並且還保存了原始信息並使代碼更安全。

下面的代碼應該可以工作,並且即使連續多次運行它也會產生相同的結果。