dyplr
으로 이것을 수행하는 방법을 모르지만 직접 RSQLite
으로 처리 할 수 있습니다. 문제는 실질적으로 RSQLite
과 같지 않지만 사실은 목록을 mutate
에 전달하는 방법을 알지 못합니다. 코드에서 다음과 같이 작동합니다.
cars_tbl %>% mutate(new_col = another_column/3.14)
어쨌든, 저의 대안입니다. 장난감 프레임 cars
을 만들었습니다.
cars <- data.frame(year=c(1999, 2007, 2009, 2017), model=c("Ford", "Toyota", "Toyota", "BMW"))
내가 연결을 열고 실제로 테이블을 생성,
dbcon <- dbConnect(RSQLite::SQLite(), "cars.db")
dbWriteTable(dbcon, name = "cars", value = cars)
가 새 열을 추가하고 확인
dbGetQuery(dbcon, "ALTER TABLE cars ADD COLUMN new_col TEXT")
dbGetQuery(dbcon, "SELECT * FROM cars")
year model new_col
1 1999 Ford <NA>
2 2007 Toyota <NA>
3 2009 Toyota <NA>
4 2017 BMW <NA>
그리고 당신은 새로운 열을 업데이트 할 수 있지만, 까다로운 유일한 당신이 where
성명서를 제출해야한다는 것입니다.이 경우 나는 올해를 사용합니다.
new_values <- sample(c("A","B","C"), nrow(cars), replace = TRUE)
new_values
[1] "C" "B" "B" "B"
dbGetPreparedQuery(dbcon, "UPDATE cars SET new_col = ? where year=?",
bind.data=data.frame(new_col=new_values,
year=cars$year))
dbGetQuery(dbcon, "SELECT * FROM cars")
year model new_col
1 1999 Ford C
2 2007 Toyota B
3 2009 Toyota B
4 2017 BMW B
는 고유 인덱스로, 당신은 항상
rownames(cars)
사용할 수 있지만 당신은 당신의 dataframe에서 다음 테이블의 열로 추가해야합니다. @krlmlr에 의해 제안 후
는
편집 : 실제로 훨씬 더 대신 dbGetPreparedQuery
되지 않는의 dbExecute
를 사용하여, 의견 후
dbExecute(dbcon, "UPDATE cars SET new_col = :new_col where year = :year",
params=data.frame(new_col=new_values,
year=cars$year))
편집 :하지만 경우에도, 몇 일 전에 이것에 대해 생각하지 않았다 SQLite
이고 rowid
을 사용할 수 있습니다. 나는 이것을 테스트했고 작동합니다.
dbExecute(dbcon, "UPDATE cars SET new_col = :new_col where rowid = :id",
params=data.frame(new_col=new_values,
id=rownames(cars)))
테이블의 rowid가 rownames와 동일한 지 반드시 확인해야합니다. 어쨌든 당신은 항상 다음과 같은 rowid를 얻을 수 있습니다 :
dbGetQuery(dbcon, "SELECT rowid, * FROM cars")
rowid year model new_col
1 1 1999 Ford C
2 2 2007 Toyota B
3 3 2009 Toyota B
4 4 2017 BMW B
dplyr는 입력 데이터가 수정되지 않도록 설계되었습니다. 그러나 기존 테이블/데이터 프레임과'mutate()'변환을 기반으로 새로운 테이블을 생성 할 수 있습니다. – krlmlr